From a629e6fcfeb952d77da280e69d645b17d94b2e4c Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sat, 8 Jun 2024 21:36:07 +0200 Subject: [PATCH 01/16] fix: avoid to modify stored charging profiles MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/Helpers.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 2c264cd5..74b5e2af 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -636,15 +636,14 @@ export const getConnectorChargingProfiles = ( chargingStation: ChargingStation, connectorId: number ): ChargingProfile[] => { - return clone( - (chargingStation.getConnectorStatus(connectorId)?.chargingProfiles ?? []) - .sort((a, b) => b.stackLevel - a.stackLevel) - .concat( - (chargingStation.getConnectorStatus(0)?.chargingProfiles ?? []).sort( - (a, b) => b.stackLevel - a.stackLevel - ) - ) - ) + return (chargingStation.getConnectorStatus(connectorId)?.chargingProfiles ?? []) + .slice() + .sort((a, b) => b.stackLevel - a.stackLevel) + .concat( + (chargingStation.getConnectorStatus(0)?.chargingProfiles ?? []) + .slice() + .sort((a, b) => b.stackLevel - a.stackLevel) + ) } export const getChargingStationConnectorChargingProfilesPowerLimit = ( -- 2.34.1 From 7abb61bb4a4e1de238c6bdb31b1a017bcf56d7b6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Jun 2024 13:08:07 +0200 Subject: [PATCH 02/16] feat: handle charging profile purpose TxProfile MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/Helpers.ts | 43 +++++++++++++------ .../ocpp/1.6/OCPP16IncomingRequestService.ts | 1 - 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 74b5e2af..4d6a477c 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -625,23 +625,39 @@ export const getAmperageLimitationUnitDivider = (stationInfo: ChargingStationInf } /** - * Gets the connector cloned charging profiles applying a power limitation - * and sorted by connector id descending then stack level descending + * Gets the connector charging profiles relevant for power limitation shallow cloned and sorted by priorities * - * @param chargingStation - - * @param connectorId - + * @param chargingStation - Charging station + * @param connectorId - Connector id * @returns connector charging profiles array */ export const getConnectorChargingProfiles = ( chargingStation: ChargingStation, connectorId: number ): ChargingProfile[] => { + // FIXME: handle charging profile purpose CHARGE_POINT_MAX_PROFILE return (chargingStation.getConnectorStatus(connectorId)?.chargingProfiles ?? []) .slice() - .sort((a, b) => b.stackLevel - a.stackLevel) + .sort((a, b) => { + if ( + a.chargingProfilePurpose === ChargingProfilePurposeType.TX_PROFILE && + b.chargingProfilePurpose === ChargingProfilePurposeType.TX_DEFAULT_PROFILE + ) { + return -1 + } else if ( + a.chargingProfilePurpose === ChargingProfilePurposeType.TX_DEFAULT_PROFILE && + b.chargingProfilePurpose === ChargingProfilePurposeType.TX_PROFILE + ) { + return 1 + } + return b.stackLevel - a.stackLevel + }) .concat( (chargingStation.getConnectorStatus(0)?.chargingProfiles ?? []) - .slice() + .filter( + chargingProfile => + chargingProfile.chargingProfilePurpose === ChargingProfilePurposeType.TX_DEFAULT_PROFILE + ) .sort((a, b) => b.stackLevel - a.stackLevel) ) } @@ -651,7 +667,6 @@ export const getChargingStationConnectorChargingProfilesPowerLimit = ( connectorId: number ): number | undefined => { let limit: number | undefined, chargingProfile: ChargingProfile | undefined - // Get charging profiles sorted by connector id then stack level const chargingProfiles = getConnectorChargingProfiles(chargingStation, connectorId) if (isNotEmptyArray(chargingProfiles)) { const result = getLimitFromChargingProfiles( @@ -868,6 +883,7 @@ const getLimitFromChargingProfiles = ( const debugLogMsg = `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Matching charging profile found for power limitation: %j` const currentDate = new Date() const connectorStatus = chargingStation.getConnectorStatus(connectorId) + let previousActiveChargingProfile: ChargingProfile | undefined for (const chargingProfile of chargingProfiles) { const chargingSchedule = chargingProfile.chargingSchedule if (chargingSchedule.startSchedule == null) { @@ -951,15 +967,12 @@ const getLimitFromChargingProfiles = ( ) { // Found the schedule period: previous is the correct one const result: ChargingProfilesLimit = { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - limit: previousChargingSchedulePeriod!.limit, - chargingProfile + limit: previousChargingSchedulePeriod?.limit ?? chargingSchedulePeriod.limit, + chargingProfile: previousActiveChargingProfile ?? chargingProfile } logger.debug(debugLogMsg, result) return result } - // Keep a reference to previous one - previousChargingSchedulePeriod = chargingSchedulePeriod // Handle the last schedule period within the charging profile duration if ( index === chargingSchedule.chargingSchedulePeriod.length - 1 || @@ -973,14 +986,18 @@ const getLimitFromChargingProfiles = ( ) > chargingSchedule.duration) ) { const result: ChargingProfilesLimit = { - limit: previousChargingSchedulePeriod.limit, + limit: chargingSchedulePeriod.limit, chargingProfile } logger.debug(debugLogMsg, result) return result } + // Keep a reference to previous charging schedule period + previousChargingSchedulePeriod = chargingSchedulePeriod } } + // Keep a reference to previous active charging profile + previousActiveChargingProfile = chargingProfile } } } diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index e78ff997..ec55ce97 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -979,7 +979,6 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { start: currentDate, end: addSeconds(currentDate, duration) } - // Get charging profiles sorted by connector id then stack level const chargingProfiles: OCPP16ChargingProfile[] = getConnectorChargingProfiles( chargingStation, connectorId -- 2.34.1 From cc04ce3549100de93505abdd6ff43fd3d968998d Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Jun 2024 13:14:20 +0200 Subject: [PATCH 03/16] chore: version 1.3.5 --- CHANGELOG.md | 29 ++++++++++++++++++++++++++++- package.json | 2 +- sonar-project.properties | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 883d2e38..9a0f9b85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,32 @@ # Changelog -## [v1.3.4](https://github.com/sap/e-mobility-charging-stations-simulator/compare/v1.3.3...v1.3.4) +## [v1.3.5](https://github.com/sap/e-mobility-charging-stations-simulator/compare/v1.3.4...v1.3.5) + +- test: add ErrorUtils test [`d05b53c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/d05b53c7a03b8fad2e106caee68d5871cc6aac6e) +- test: improve ErrorUtils coverage [`2d4928a`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/2d4928a7237a906158f2e9652e08f0392eeabdcd) +- build(deps-dev): apply updates [`c4387ed`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/c4387ed4b3d2021034f452deeb35276fabe022e2) +- feat: handle charging profile purpose TxProfile [`7abb61b`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/7abb61bb4a4e1de238c6bdb31b1a017bcf56d7b6) +- build(deps-dev): apply updates [`65b608f`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/65b608f0259f6f59138406ea327d22ecd6a19361) +- test: add tests [`b49550e`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/b49550e256d11c7a30fb19cd672e5e3611d01553) +- test: improve coverage on existing tests [`ff40d2c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/ff40d2cc466140d6f18bc15b742100dd4f060d0f) +- fix: restart metervalues interval if MeterValueSampleInterval is changed [`b8e3363`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/b8e3363a179fcf79d8bb66f47724b377d4d38a75) +- refactor: rename Storage.handleDBError -> Storage.handleDBStorageError [`a03b18c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/a03b18c4731bfd1173ff67b74a75684d3f6bb470) +- fix: allow to set charging profile with TxProfile purpose [`65099c1`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/65099c1e7297b252523172096a8d6ded22daa702) +- fix: avoid to modify stored charging profiles [`a629e6f`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/a629e6fcfeb952d77da280e69d645b17d94b2e4c) +- test: add ConfigurationUtils test [`2a9305b`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/2a9305b5ace7b5a49b5862c4282c1a88e3087da5) +- perf: compute power limitation only once [`5b1bd2d`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/5b1bd2d2c3c606aeef58cb1098def9a20c50dc4e) +- fix: refine default configuration [`a9babd5`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/a9babd5006e9b70f281d4bd654923fc3d63cd733) +- test: improve ConfigurationUtils coverage [`8598b56`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/8598b5618e5acf6b9e2538faa5225ba51aa68d10) +- test: add Utils insertAt() test [`055d4c4`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/055d4c4c39c9c1fcce050019c61caf305ec1a83e) +- test: trivial refinements [`0acbf5e`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/0acbf5e6ab020dda7ddc6785347c05c144de3bd9) +- fix: ensure ATG status is refreshed in the UI at stop [`c004d5e`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/c004d5e2e7d277ab99b3ee1b8ce363736529db9e) +- test: improve ConfigurationUtils coverage [`329f14c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/329f14c004f74241c7cae1400e81740f3333eeee) +- fix: add sanity check in ATG on connector id [`a4d9680`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/a4d9680730c77debfb3b9455e4bd5b63e61ce664) +- perf: add fastpath in array sorting helper [`8bfa4d2`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/8bfa4d2be3f3817654791f166f4aab1b02485005) +- fix: fix start transaction response handling with authorize [`ae8fb16`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/ae8fb16df7c98a9238e61b1b358f8fbe2aee7a74) +- fix: fix condition at ATG configuration handling [`274f9b3`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/274f9b3662d8cf5e5fb0a361a1ae9fac86309e40) + +## [v1.3.4](https://github.com/sap/e-mobility-charging-stations-simulator/compare/v1.3.3...v1.3.4) (2024-06-06) - build(deps): bump sonarsource/sonarcloud-github-action from 2.1.1 to 2.2.0 [`#1038`](https://github.com/sap/e-mobility-charging-stations-simulator/pull/1038) - build(deps): bump pnpm/action-setup from 3 to 4 [`#1037`](https://github.com/sap/e-mobility-charging-stations-simulator/pull/1037) @@ -33,6 +59,7 @@ - build(deps): apply updates [`0972694`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/0972694d006542648c971026f43e5f4c8498f459) - build(deps-dev): apply updates [`36158bb`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/36158bb7c539757a8b4a898dd6093d6805376921) - build(deps): apply updates [`1f851da`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/1f851da6440e4e4a31e959fcb8802b6c7f30beef) +- chore: version 1.3.4 [`13a6494`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/13a6494f3542b9ed8773311302fa85258a1edec7) - refactor: cleanup OCPP utils [`01b82de`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/01b82de5b532cd149eccab7b82fe86a741289581) - build(deps-dev): apply updates [`55e006e`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/55e006e1af126c62f26f39cd4a1f91ebd44b865d) - fix: ensure only circular buffer is converted to array [`312d325`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/312d3254e6581f6bc939497d610048b6c6226d6d) diff --git a/package.json b/package.json index f05e1bc2..1130f213 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "e-mobility-charging-stations-simulator", - "version": "1.3.4", + "version": "1.3.5", "engines": { "node": ">=18.18.0", "pnpm": ">=9.0.0" diff --git a/sonar-project.properties b/sonar-project.properties index ebcf46d2..6b31499a 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=sap-1 # This is the name and version displayed in the SonarCloud UI. sonar.projectName=e-mobility-charging-stations-simulator -sonar.projectVersion=1.3.4 +sonar.projectVersion=1.3.5 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. sonar.sources=src -- 2.34.1 From 7b0a334d2c0e42768b246cbc962718d605ca7464 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Jun 2024 13:28:52 +0200 Subject: [PATCH 04/16] build(deps-dev): apply updates MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- package.json | 2 +- pnpm-lock.yaml | 42 +++++++++++++++++++++--------------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 1130f213..ad8ceae9 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "rimraf": "^5.0.7", "semver": "^7.6.2", "ts-node": "^10.9.2", - "tsx": "^4.14.0", + "tsx": "^4.15.1", "typescript": "~5.4.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6597357..5ec8f760 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -188,8 +188,8 @@ importers: specifier: ^10.9.2 version: 10.9.2(@types/node@20.14.2)(typescript@5.4.5) tsx: - specifier: ^4.14.0 - version: 4.14.0 + specifier: ^4.15.1 + version: 4.15.1 typescript: specifier: ~5.4.5 version: 5.4.5 @@ -1823,8 +1823,8 @@ packages: engines: {node: '>= 0.8'} hasBin: true - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -5794,8 +5794,8 @@ packages: tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - tsx@4.14.0: - resolution: {integrity: sha512-DsDLlJlusAPyCnz07S4y0gqJoUl8GciBeYcXQd75/5DqkZ4gfjKpvAUFUzmZf62nEotkcqC7JCWrdL8d+PXSng==} + tsx@4.15.1: + resolution: {integrity: sha512-k/6h17jA1KfUR7SpcteOa880zGmF56s8gMIcSqUR5avyNFi9nlCEKpMiHLrzrqyARGr52A/JablmGey1DEWbCA==} engines: {node: '>=18.0.0'} hasBin: true @@ -6067,8 +6067,8 @@ packages: vm-browserify@1.1.2: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} - vue-component-type-helpers@2.0.20: - resolution: {integrity: sha512-Weol01CnbTkPrKHT4Gi5q+llB170X/q/oJ0AYrC1zRBm+OhEun1+j4mKr2Y1kXG1hgGnjvuBPshy+bRefGczTA==} + vue-component-type-helpers@2.0.21: + resolution: {integrity: sha512-3NaicyZ7N4B6cft4bfb7dOnPbE9CjLcx+6wZWAg5zwszfO4qXRh+U52dN5r5ZZfc6iMaxKCEcoH9CmxxoFZHLg==} vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} @@ -6276,8 +6276,8 @@ packages: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} - yaml@2.4.3: - resolution: {integrity: sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==} + yaml@2.4.5: + resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} engines: {node: '>= 14'} hasBin: true @@ -6391,7 +6391,7 @@ snapshots: dependencies: '@babel/compat-data': 7.24.7 '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.0 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 7.6.2 @@ -7701,7 +7701,7 @@ snapshots: '@vue/test-utils@2.4.6': dependencies: js-beautify: 1.15.1 - vue-component-type-helpers: 2.0.20 + vue-component-type-helpers: 2.0.21 '@vue/tsconfig@0.5.1': {} @@ -8185,12 +8185,12 @@ snapshots: vm-browserify: 1.1.2 xtend: 4.0.2 - browserslist@4.23.0: + browserslist@4.23.1: dependencies: caniuse-lite: 1.0.30001629 electron-to-chromium: 1.4.796 node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.1) bson@6.7.0: {} @@ -10717,7 +10717,7 @@ snapshots: micromatch: 4.0.7 pidtree: 0.6.0 string-argv: 0.3.2 - yaml: 2.4.3 + yaml: 2.4.5 transitivePeerDependencies: - supports-color @@ -12691,9 +12691,9 @@ snapshots: tslib@2.6.3: {} - tsx@4.14.0: + tsx@4.15.1: dependencies: - esbuild: 0.20.2 + esbuild: 0.21.4 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 @@ -12836,9 +12836,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.0.16(browserslist@4.23.0): + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.1 @@ -12997,7 +12997,7 @@ snapshots: vm-browserify@1.1.2: {} - vue-component-type-helpers@2.0.20: {} + vue-component-type-helpers@2.0.21: {} vue-eslint-parser@9.4.3(eslint@8.57.0): dependencies: @@ -13216,7 +13216,7 @@ snapshots: yallist@5.0.0: {} - yaml@2.4.3: {} + yaml@2.4.5: {} yargs-parser@15.0.3: dependencies: -- 2.34.1 From 3edfdf53dc3c75bf26b4737bb014e6e98239ef38 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Jun 2024 15:52:02 +0200 Subject: [PATCH 05/16] fix: ensure no charging profile purpose TxProfile is loaded at startup MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/ChargingStation.ts | 6 +++--- src/charging-station/Helpers.ts | 23 +++++++++++++---------- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index 47e911a4..7dbb0d3e 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -131,7 +131,7 @@ import { hasFeatureProfile, hasReservationExpired, initializeConnectorsMapStatus, - prepareDatesInConnectorStatus, + prepareConnectorStatus, propagateSerialNumber, setChargingStationOptions, stationTemplateToStationInfo, @@ -1480,7 +1480,7 @@ export class ChargingStation extends EventEmitter { for (const [connectorId, connectorStatus] of configuration.connectorsStatus.entries()) { this.connectors.set( connectorId, - prepareDatesInConnectorStatus(clone(connectorStatus)) + prepareConnectorStatus(clone(connectorStatus)) ) } } else if (configuration.evsesStatus != null && configuration.connectorsStatus == null) { @@ -1493,7 +1493,7 @@ export class ChargingStation extends EventEmitter { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion evseStatusConfiguration.connectorsStatus!.map((connectorStatus, connectorId) => [ connectorId, - prepareDatesInConnectorStatus(connectorStatus) + prepareConnectorStatus(connectorStatus) ]) ) }) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 4d6a477c..01c7f292 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -436,22 +436,25 @@ export const resetConnectorStatus = (connectorStatus: ConnectorStatus | undefine delete connectorStatus.transactionBeginMeterValue } -export const prepareDatesInConnectorStatus = ( - connectorStatus: ConnectorStatus -): ConnectorStatus => { +export const prepareConnectorStatus = (connectorStatus: ConnectorStatus): ConnectorStatus => { if (connectorStatus.reservation != null) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion connectorStatus.reservation.expiryDate = convertToDate(connectorStatus.reservation.expiryDate)! } if (isNotEmptyArray(connectorStatus.chargingProfiles)) { - connectorStatus.chargingProfiles = connectorStatus.chargingProfiles.map(chargingProfile => { - chargingProfile.chargingSchedule.startSchedule = convertToDate( - chargingProfile.chargingSchedule.startSchedule + connectorStatus.chargingProfiles = connectorStatus.chargingProfiles + .filter( + chargingProfile => + chargingProfile.chargingProfilePurpose !== ChargingProfilePurposeType.TX_PROFILE ) - chargingProfile.validFrom = convertToDate(chargingProfile.validFrom) - chargingProfile.validTo = convertToDate(chargingProfile.validTo) - return chargingProfile - }) + .map(chargingProfile => { + chargingProfile.chargingSchedule.startSchedule = convertToDate( + chargingProfile.chargingSchedule.startSchedule + ) + chargingProfile.validFrom = convertToDate(chargingProfile.validFrom) + chargingProfile.validTo = convertToDate(chargingProfile.validTo) + return chargingProfile + }) } return connectorStatus } -- 2.34.1 From d020e249e5206699107d6e63d3d585a7e72e7830 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Jun 2024 16:00:35 +0200 Subject: [PATCH 06/16] fix: fix TxProfile removal with transaction id defined at Tx stop MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/Helpers.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 01c7f292..93df1ded 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -420,10 +420,11 @@ export const resetConnectorStatus = (connectorStatus: ConnectorStatus | undefine if (isNotEmptyArray(connectorStatus.chargingProfiles)) { connectorStatus.chargingProfiles = connectorStatus.chargingProfiles.filter( chargingProfile => - chargingProfile.chargingProfilePurpose !== ChargingProfilePurposeType.TX_PROFILE || - (chargingProfile.transactionId != null && + (chargingProfile.chargingProfilePurpose === ChargingProfilePurposeType.TX_PROFILE && + chargingProfile.transactionId != null && connectorStatus.transactionId != null && - chargingProfile.transactionId !== connectorStatus.transactionId) + chargingProfile.transactionId !== connectorStatus.transactionId) || + chargingProfile.chargingProfilePurpose !== ChargingProfilePurposeType.TX_PROFILE ) } resetAuthorizeConnectorStatus(connectorStatus) -- 2.34.1 From c76d9c83dba681eeccd78dcfae661b085d7ccf2b Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Sun, 9 Jun 2024 23:00:48 +0200 Subject: [PATCH 07/16] refactor: cleanup charging profiles handling code MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/Helpers.ts | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 93df1ded..816db88b 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -670,18 +670,16 @@ export const getChargingStationConnectorChargingProfilesPowerLimit = ( chargingStation: ChargingStation, connectorId: number ): number | undefined => { - let limit: number | undefined, chargingProfile: ChargingProfile | undefined const chargingProfiles = getConnectorChargingProfiles(chargingStation, connectorId) if (isNotEmptyArray(chargingProfiles)) { - const result = getLimitFromChargingProfiles( + const chargingProfilesLimit = getLimitFromChargingProfiles( chargingStation, connectorId, chargingProfiles, chargingStation.logPrefix() ) - if (result != null) { - limit = result.limit - chargingProfile = result.chargingProfile + if (chargingProfilesLimit != null) { + let { limit, chargingProfile } = chargingProfilesLimit switch (chargingStation.stationInfo?.currentOutType) { case CurrentType.AC: limit = @@ -709,13 +707,13 @@ export const getChargingStationConnectorChargingProfilesPowerLimit = ( `${chargingStation.logPrefix()} ${moduleName}.getChargingStationConnectorChargingProfilesPowerLimit: Charging profile id ${ chargingProfile.chargingProfileId } limit ${limit} is greater than connector id ${connectorId} maximum ${connectorMaximumPower}: %j`, - result + chargingProfilesLimit ) limit = connectorMaximumPower } + return limit } } - return limit } export const getDefaultVoltageOut = ( @@ -884,7 +882,7 @@ const getLimitFromChargingProfiles = ( chargingProfiles: ChargingProfile[], logPrefix: string ): ChargingProfilesLimit | undefined => { - const debugLogMsg = `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Matching charging profile found for power limitation: %j` + const debugLogMsg = `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profiles limit found: %j` const currentDate = new Date() const connectorStatus = chargingStation.getConnectorStatus(connectorId) let previousActiveChargingProfile: ChargingProfile | undefined @@ -949,12 +947,12 @@ const getLimitFromChargingProfiles = ( } // Handle only one schedule period if (chargingSchedule.chargingSchedulePeriod.length === 1) { - const result: ChargingProfilesLimit = { + const chargingProfilesLimit: ChargingProfilesLimit = { limit: chargingSchedule.chargingSchedulePeriod[0].limit, chargingProfile } - logger.debug(debugLogMsg, result) - return result + logger.debug(debugLogMsg, chargingProfilesLimit) + return chargingProfilesLimit } let previousChargingSchedulePeriod: ChargingSchedulePeriod | undefined // Search for the right schedule period @@ -970,12 +968,12 @@ const getLimitFromChargingProfiles = ( ) ) { // Found the schedule period: previous is the correct one - const result: ChargingProfilesLimit = { + const chargingProfilesLimit: ChargingProfilesLimit = { limit: previousChargingSchedulePeriod?.limit ?? chargingSchedulePeriod.limit, chargingProfile: previousActiveChargingProfile ?? chargingProfile } - logger.debug(debugLogMsg, result) - return result + logger.debug(debugLogMsg, chargingProfilesLimit) + return chargingProfilesLimit } // Handle the last schedule period within the charging profile duration if ( @@ -989,12 +987,12 @@ const getLimitFromChargingProfiles = ( chargingSchedule.startSchedule ) > chargingSchedule.duration) ) { - const result: ChargingProfilesLimit = { + const chargingProfilesLimit: ChargingProfilesLimit = { limit: chargingSchedulePeriod.limit, chargingProfile } - logger.debug(debugLogMsg, result) - return result + logger.debug(debugLogMsg, chargingProfilesLimit) + return chargingProfilesLimit } // Keep a reference to previous charging schedule period previousChargingSchedulePeriod = chargingSchedulePeriod -- 2.34.1 From 357991053f9d8910cdfaebde426eca58f813c05f Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 15:41:44 +0200 Subject: [PATCH 08/16] feat: handle CHARGE_POINT_MAX_PROFILE charging profiles at power limitation MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/ChargingStation.ts | 24 ++-- src/charging-station/Helpers.ts | 134 ++++++++++++------ .../ocpp/1.6/OCPP16IncomingRequestService.ts | 1 + 3 files changed, 108 insertions(+), 51 deletions(-) diff --git a/src/charging-station/ChargingStation.ts b/src/charging-station/ChargingStation.ts index 7dbb0d3e..e217991a 100644 --- a/src/charging-station/ChargingStation.ts +++ b/src/charging-station/ChargingStation.ts @@ -120,8 +120,9 @@ import { createSerialNumber, getAmperageLimitationUnitDivider, getBootConnectorStatus, - getChargingStationConnectorChargingProfilesPowerLimit, + getChargingStationChargingProfilesLimit, getChargingStationId, + getConnectorChargingProfilesLimit, getDefaultVoltageOut, getHashId, getIdTagsFile, @@ -391,14 +392,14 @@ export class ChargingStation extends EventEmitter { } public getConnectorMaximumAvailablePower (connectorId: number): number { - let connectorAmperageLimitationPowerLimit: number | undefined + let connectorAmperageLimitationLimit: number | undefined const amperageLimitation = this.getAmperageLimitation() if ( amperageLimitation != null && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion amperageLimitation < this.stationInfo!.maximumAmperage! ) { - connectorAmperageLimitationPowerLimit = + connectorAmperageLimitationLimit = (this.stationInfo?.currentOutType === CurrentType.AC ? ACElectricUtils.powerTotal( this.getNumberOfPhases(), @@ -414,20 +415,25 @@ export class ChargingStation extends EventEmitter { } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const connectorMaximumPower = this.stationInfo!.maximumPower! / this.powerDivider! - const connectorChargingProfilesPowerLimit = - getChargingStationConnectorChargingProfilesPowerLimit(this, connectorId) + const chargingStationChargingProfilesLimit = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + getChargingStationChargingProfilesLimit(this)! / this.powerDivider! + const connectorChargingProfilesLimit = getConnectorChargingProfilesLimit(this, connectorId) return min( isNaN(connectorMaximumPower) ? Number.POSITIVE_INFINITY : connectorMaximumPower, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - isNaN(connectorAmperageLimitationPowerLimit!) + isNaN(connectorAmperageLimitationLimit!) ? Number.POSITIVE_INFINITY : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - connectorAmperageLimitationPowerLimit!, + connectorAmperageLimitationLimit!, + isNaN(chargingStationChargingProfilesLimit) + ? Number.POSITIVE_INFINITY + : chargingStationChargingProfilesLimit, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - isNaN(connectorChargingProfilesPowerLimit!) + isNaN(connectorChargingProfilesLimit!) ? Number.POSITIVE_INFINITY : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - connectorChargingProfilesPowerLimit! + connectorChargingProfilesLimit! ) } diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index 816db88b..cc0422e1 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -628,8 +628,46 @@ export const getAmperageLimitationUnitDivider = (stationInfo: ChargingStationInf return unitDivider } +const getChargingStationChargingProfiles = ( + chargingStation: ChargingStation +): ChargingProfile[] => { + return (chargingStation.getConnectorStatus(0)?.chargingProfiles ?? []) + .filter( + chargingProfile => + chargingProfile.chargingProfilePurpose === + ChargingProfilePurposeType.CHARGE_POINT_MAX_PROFILE + ) + .sort((a, b) => b.stackLevel - a.stackLevel) +} + +export const getChargingStationChargingProfilesLimit = ( + chargingStation: ChargingStation +): number | undefined => { + const chargingProfiles = getChargingStationChargingProfiles(chargingStation) + if (isNotEmptyArray(chargingProfiles)) { + const chargingProfilesLimit = getChargingProfilesLimit(chargingStation, 0, chargingProfiles) + if (chargingProfilesLimit != null) { + const limit = buildChargingProfilesLimit(chargingStation, chargingProfilesLimit) + const chargingStationMaximumPower = + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + chargingStation.stationInfo!.maximumPower! + if (limit > chargingStationMaximumPower) { + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.getChargingStationChargingProfilesLimit: Charging profile id ${ + chargingProfilesLimit.chargingProfile.chargingProfileId + } limit ${limit} is greater than charging station maximum ${chargingStationMaximumPower}: %j`, + chargingProfilesLimit + ) + return chargingStationMaximumPower + } + return limit + } + } +} + /** - * Gets the connector charging profiles relevant for power limitation shallow cloned and sorted by priorities + * Gets the connector charging profiles relevant for power limitation shallow cloned + * and sorted by priorities * * @param chargingStation - Charging station * @param connectorId - Connector id @@ -639,7 +677,6 @@ export const getConnectorChargingProfiles = ( chargingStation: ChargingStation, connectorId: number ): ChargingProfile[] => { - // FIXME: handle charging profile purpose CHARGE_POINT_MAX_PROFILE return (chargingStation.getConnectorStatus(connectorId)?.chargingProfiles ?? []) .slice() .sort((a, b) => { @@ -666,47 +703,27 @@ export const getConnectorChargingProfiles = ( ) } -export const getChargingStationConnectorChargingProfilesPowerLimit = ( +export const getConnectorChargingProfilesLimit = ( chargingStation: ChargingStation, connectorId: number ): number | undefined => { const chargingProfiles = getConnectorChargingProfiles(chargingStation, connectorId) if (isNotEmptyArray(chargingProfiles)) { - const chargingProfilesLimit = getLimitFromChargingProfiles( + const chargingProfilesLimit = getChargingProfilesLimit( chargingStation, connectorId, - chargingProfiles, - chargingStation.logPrefix() + chargingProfiles ) if (chargingProfilesLimit != null) { - let { limit, chargingProfile } = chargingProfilesLimit - switch (chargingStation.stationInfo?.currentOutType) { - case CurrentType.AC: - limit = - chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT - ? limit - : ACElectricUtils.powerTotal( - chargingStation.getNumberOfPhases(), - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - chargingStation.stationInfo.voltageOut!, - limit - ) - break - case CurrentType.DC: - limit = - chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT - ? limit - : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - DCElectricUtils.power(chargingStation.stationInfo.voltageOut!, limit) - } + let limit = buildChargingProfilesLimit(chargingStation, chargingProfilesLimit) const connectorMaximumPower = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion chargingStation.stationInfo!.maximumPower! / chargingStation.powerDivider! if (limit > connectorMaximumPower) { logger.error( - `${chargingStation.logPrefix()} ${moduleName}.getChargingStationConnectorChargingProfilesPowerLimit: Charging profile id ${ - chargingProfile.chargingProfileId - } limit ${limit} is greater than connector id ${connectorId} maximum ${connectorMaximumPower}: %j`, + `${chargingStation.logPrefix()} ${moduleName}.getConnectorChargingProfilesLimit: Charging profile id ${ + chargingProfilesLimit.chargingProfile.chargingProfileId + } limit ${limit} is greater than connector ${connectorId} maximum ${connectorMaximumPower}: %j`, chargingProfilesLimit ) limit = connectorMaximumPower @@ -716,6 +733,33 @@ export const getChargingStationConnectorChargingProfilesPowerLimit = ( } } +const buildChargingProfilesLimit = ( + chargingStation: ChargingStation, + chargingProfilesLimit: ChargingProfilesLimit +): number => { + let { limit, chargingProfile } = chargingProfilesLimit + switch (chargingStation.stationInfo?.currentOutType) { + case CurrentType.AC: + limit = + chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT + ? limit + : ACElectricUtils.powerTotal( + chargingStation.getNumberOfPhases(), + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + chargingStation.stationInfo.voltageOut!, + limit + ) + break + case CurrentType.DC: + limit = + chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT + ? limit + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + DCElectricUtils.power(chargingStation.stationInfo.voltageOut!, limit) + } + return limit +} + export const getDefaultVoltageOut = ( currentType: CurrentType, logPrefix: string, @@ -868,21 +912,20 @@ interface ChargingProfilesLimit { } /** - * Charging profiles shall already be sorted by connector id descending then stack level descending + * Get the charging profiles limit for a connector + * Charging profiles shall already be sorted by priorities * * @param chargingStation - * @param connectorId - * @param chargingProfiles - - * @param logPrefix - * @returns ChargingProfilesLimit */ -const getLimitFromChargingProfiles = ( +const getChargingProfilesLimit = ( chargingStation: ChargingStation, connectorId: number, - chargingProfiles: ChargingProfile[], - logPrefix: string + chargingProfiles: ChargingProfile[] ): ChargingProfilesLimit | undefined => { - const debugLogMsg = `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profiles limit found: %j` + const debugLogMsg = `${chargingStation.logPrefix()} ${moduleName}.getChargingProfilesLimit: Charging profiles limit found: %j` const currentDate = new Date() const connectorStatus = chargingStation.getConnectorStatus(connectorId) let previousActiveChargingProfile: ChargingProfile | undefined @@ -890,29 +933,36 @@ const getLimitFromChargingProfiles = ( const chargingSchedule = chargingProfile.chargingSchedule if (chargingSchedule.startSchedule == null) { logger.debug( - `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} has no startSchedule defined. Trying to set it to the connector current transaction start date` + `${chargingStation.logPrefix()} ${moduleName}.getChargingProfilesLimit: Charging profile id ${chargingProfile.chargingProfileId} has no startSchedule defined. Trying to set it to the connector current transaction start date` ) // OCPP specifies that if startSchedule is not defined, it should be relative to start of the connector transaction chargingSchedule.startSchedule = connectorStatus?.transactionStart } if (!isDate(chargingSchedule.startSchedule)) { logger.warn( - `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} startSchedule property is not a Date instance. Trying to convert it to a Date instance` + `${chargingStation.logPrefix()} ${moduleName}.getChargingProfilesLimit: Charging profile id ${chargingProfile.chargingProfileId} startSchedule property is not a Date instance. Trying to convert it to a Date instance` ) // eslint-disable-next-line @typescript-eslint/no-non-null-assertion chargingSchedule.startSchedule = convertToDate(chargingSchedule.startSchedule)! } if (chargingSchedule.duration == null) { logger.debug( - `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} has no duration defined and will be set to the maximum time allowed` + `${chargingStation.logPrefix()} ${moduleName}.getChargingProfilesLimit: Charging profile id ${chargingProfile.chargingProfileId} has no duration defined and will be set to the maximum time allowed` ) // OCPP specifies that if duration is not defined, it should be infinite chargingSchedule.duration = differenceInSeconds(maxTime, chargingSchedule.startSchedule) } - if (!prepareChargingProfileKind(connectorStatus, chargingProfile, currentDate, logPrefix)) { + if ( + !prepareChargingProfileKind( + connectorStatus, + chargingProfile, + currentDate, + chargingStation.logPrefix() + ) + ) { continue } - if (!canProceedChargingProfile(chargingProfile, currentDate, logPrefix)) { + if (!canProceedChargingProfile(chargingProfile, currentDate, chargingStation.logPrefix())) { continue } // Check if the charging profile is active @@ -934,14 +984,14 @@ const getLimitFromChargingProfiles = ( ) ) { logger.warn( - `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} schedule periods are not sorted by start period` + `${chargingStation.logPrefix()} ${moduleName}.getChargingProfilesLimit: Charging profile id ${chargingProfile.chargingProfileId} schedule periods are not sorted by start period` ) chargingSchedule.chargingSchedulePeriod.sort(chargingSchedulePeriodCompareFn) } // Check if the first schedule period startPeriod property is equal to 0 if (chargingSchedule.chargingSchedulePeriod[0].startPeriod !== 0) { logger.error( - `${logPrefix} ${moduleName}.getLimitFromChargingProfiles: Charging profile id ${chargingProfile.chargingProfileId} first schedule period start period ${chargingSchedule.chargingSchedulePeriod[0].startPeriod} is not equal to 0` + `${chargingStation.logPrefix()} ${moduleName}.getChargingProfilesLimit: Charging profile id ${chargingProfile.chargingProfileId} first schedule period start period ${chargingSchedule.chargingSchedulePeriod[0].startPeriod} is not equal to 0` ) continue } diff --git a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts index ec55ce97..4b6a7c13 100644 --- a/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts +++ b/src/charging-station/ocpp/1.6/OCPP16IncomingRequestService.ts @@ -979,6 +979,7 @@ export class OCPP16IncomingRequestService extends OCPPIncomingRequestService { start: currentDate, end: addSeconds(currentDate, duration) } + // FIXME: add and handle charging station charging profiles const chargingProfiles: OCPP16ChargingProfile[] = getConnectorChargingProfiles( chargingStation, connectorId -- 2.34.1 From 01ffb6d3583ab4da138dad815803121f3cc6d336 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 16:13:26 +0200 Subject: [PATCH 09/16] build(deps-dev): apply updates MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- package.json | 2 +- pnpm-lock.yaml | 250 ++++++++++++++++++++++---------------------- ui/web/package.json | 2 +- 3 files changed, 127 insertions(+), 127 deletions(-) diff --git a/package.json b/package.json index ad8ceae9..bfafde93 100644 --- a/package.json +++ b/package.json @@ -130,7 +130,7 @@ "c8": "^9.1.0", "clinic": "^13.0.0", "cross-env": "^7.0.3", - "esbuild": "^0.21.4", + "esbuild": "^0.21.5", "esbuild-plugin-clean": "^1.0.1", "esbuild-plugin-copy": "^2.1.1", "eslint": "^8.57.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ec8f760..d392c6c9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -122,14 +122,14 @@ importers: specifier: ^7.0.3 version: 7.0.3 esbuild: - specifier: ^0.21.4 - version: 0.21.4 + specifier: ^0.21.5 + version: 0.21.5 esbuild-plugin-clean: specifier: ^1.0.1 - version: 1.0.1(esbuild@0.21.4) + version: 1.0.1(esbuild@0.21.5) esbuild-plugin-copy: specifier: ^2.1.1 - version: 2.1.1(esbuild@0.21.4) + version: 2.1.1(esbuild@0.21.5) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -206,8 +206,8 @@ importers: specifier: ^3.4.27 version: 3.4.27(typescript@5.4.5) vue-router: - specifier: ^4.3.2 - version: 4.3.2(vue@3.4.27(typescript@5.4.5)) + specifier: ^4.3.3 + version: 4.3.3(vue@3.4.27(typescript@5.4.5)) vue-toast-notification: specifier: ^3.1.2 version: 3.1.2(vue@3.4.27(typescript@5.4.5)) @@ -566,8 +566,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.21.4': - resolution: {integrity: sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -578,8 +578,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.4': - resolution: {integrity: sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -590,8 +590,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.4': - resolution: {integrity: sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -602,8 +602,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.4': - resolution: {integrity: sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -614,8 +614,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.4': - resolution: {integrity: sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -626,8 +626,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.4': - resolution: {integrity: sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -638,8 +638,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.4': - resolution: {integrity: sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -650,8 +650,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.4': - resolution: {integrity: sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -662,8 +662,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.4': - resolution: {integrity: sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -674,8 +674,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.4': - resolution: {integrity: sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -686,8 +686,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.4': - resolution: {integrity: sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -698,8 +698,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.4': - resolution: {integrity: sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -710,8 +710,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.4': - resolution: {integrity: sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -722,8 +722,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.4': - resolution: {integrity: sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -734,8 +734,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.4': - resolution: {integrity: sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -746,8 +746,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.4': - resolution: {integrity: sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -758,8 +758,8 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.4': - resolution: {integrity: sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -770,8 +770,8 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.4': - resolution: {integrity: sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -782,8 +782,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.4': - resolution: {integrity: sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -794,8 +794,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.4': - resolution: {integrity: sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -806,8 +806,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.4': - resolution: {integrity: sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -818,8 +818,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.4': - resolution: {integrity: sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -830,8 +830,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.4': - resolution: {integrity: sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1906,8 +1906,8 @@ packages: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - caniuse-lite@1.0.30001629: - resolution: {integrity: sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==} + caniuse-lite@1.0.30001632: + resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2682,8 +2682,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.21.4: - resolution: {integrity: sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -3856,8 +3856,8 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.3: - resolution: {integrity: sha512-uy2bNX5zQ+tESe+TiC7ilGRz8AtRGmnJH55NC5S0nSUjvvvM2hJHmefHErugGXN4pNv4Qx7vLsnNw9qJ9mtIsw==} + jiti@1.21.4: + resolution: {integrity: sha512-DUP4hpE2Of384xS46IiRm1JK3r4Ix4ADQI5k65y4joiZF7Oeo2ySdYG7PbqioljFalu1ndzto0Sb5IfExYliYA==} hasBin: true jju@1.4.0: @@ -4012,8 +4012,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -5881,8 +5881,8 @@ packages: ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.18.0: + resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} engines: {node: '>=0.8.0'} hasBin: true @@ -6076,8 +6076,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - vue-router@4.3.2: - resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==} + vue-router@4.3.3: + resolution: {integrity: sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==} peerDependencies: vue: ^3.2.0 @@ -6811,139 +6811,139 @@ snapshots: '@esbuild/aix-ppc64@0.20.2': optional: true - '@esbuild/aix-ppc64@0.21.4': + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.20.2': optional: true - '@esbuild/android-arm64@0.21.4': + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.20.2': optional: true - '@esbuild/android-arm@0.21.4': + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.20.2': optional: true - '@esbuild/android-x64@0.21.4': + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.20.2': optional: true - '@esbuild/darwin-arm64@0.21.4': + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.20.2': optional: true - '@esbuild/darwin-x64@0.21.4': + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.20.2': optional: true - '@esbuild/freebsd-arm64@0.21.4': + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.20.2': optional: true - '@esbuild/freebsd-x64@0.21.4': + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.20.2': optional: true - '@esbuild/linux-arm64@0.21.4': + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.20.2': optional: true - '@esbuild/linux-arm@0.21.4': + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.20.2': optional: true - '@esbuild/linux-ia32@0.21.4': + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.20.2': optional: true - '@esbuild/linux-loong64@0.21.4': + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.20.2': optional: true - '@esbuild/linux-mips64el@0.21.4': + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.20.2': optional: true - '@esbuild/linux-ppc64@0.21.4': + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.20.2': optional: true - '@esbuild/linux-riscv64@0.21.4': + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.20.2': optional: true - '@esbuild/linux-s390x@0.21.4': + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.20.2': optional: true - '@esbuild/linux-x64@0.21.4': + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.20.2': optional: true - '@esbuild/netbsd-x64@0.21.4': + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.20.2': optional: true - '@esbuild/openbsd-x64@0.21.4': + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.20.2': optional: true - '@esbuild/sunos-x64@0.21.4': + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.20.2': optional: true - '@esbuild/win32-arm64@0.21.4': + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.20.2': optional: true - '@esbuild/win32-ia32@0.21.4': + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.20.2': optional: true - '@esbuild/win32-x64@0.21.4': + '@esbuild/win32-x64@0.21.5': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': @@ -8187,7 +8187,7 @@ snapshots: browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001629 + caniuse-lite: 1.0.30001632 electron-to-chromium: 1.4.796 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) @@ -8296,7 +8296,7 @@ snapshots: camelcase@7.0.1: {} - caniuse-lite@1.0.30001629: {} + caniuse-lite@1.0.30001632: {} caseless@0.12.0: {} @@ -8606,7 +8606,7 @@ snapshots: dependencies: '@types/node': 20.14.2 cosmiconfig: 9.0.0(typescript@5.4.5) - jiti: 1.21.3 + jiti: 1.21.4 typescript: 5.4.5 cosmiconfig@9.0.0(typescript@5.4.5): @@ -9184,17 +9184,17 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild-plugin-clean@1.0.1(esbuild@0.21.4): + esbuild-plugin-clean@1.0.1(esbuild@0.21.5): dependencies: chalk: 4.1.2 del: 6.1.1 - esbuild: 0.21.4 + esbuild: 0.21.5 - esbuild-plugin-copy@2.1.1(esbuild@0.21.4): + esbuild-plugin-copy@2.1.1(esbuild@0.21.5): dependencies: chalk: 4.1.2 chokidar: 3.6.0 - esbuild: 0.21.4 + esbuild: 0.21.5 fs-extra: 10.1.0 globby: 11.1.0 @@ -9224,31 +9224,31 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 - esbuild@0.21.4: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.4 - '@esbuild/android-arm': 0.21.4 - '@esbuild/android-arm64': 0.21.4 - '@esbuild/android-x64': 0.21.4 - '@esbuild/darwin-arm64': 0.21.4 - '@esbuild/darwin-x64': 0.21.4 - '@esbuild/freebsd-arm64': 0.21.4 - '@esbuild/freebsd-x64': 0.21.4 - '@esbuild/linux-arm': 0.21.4 - '@esbuild/linux-arm64': 0.21.4 - '@esbuild/linux-ia32': 0.21.4 - '@esbuild/linux-loong64': 0.21.4 - '@esbuild/linux-mips64el': 0.21.4 - '@esbuild/linux-ppc64': 0.21.4 - '@esbuild/linux-riscv64': 0.21.4 - '@esbuild/linux-s390x': 0.21.4 - '@esbuild/linux-x64': 0.21.4 - '@esbuild/netbsd-x64': 0.21.4 - '@esbuild/openbsd-x64': 0.21.4 - '@esbuild/sunos-x64': 0.21.4 - '@esbuild/win32-arm64': 0.21.4 - '@esbuild/win32-ia32': 0.21.4 - '@esbuild/win32-x64': 0.21.4 + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 escalade@3.1.2: {} @@ -9968,7 +9968,7 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.18.0 har-schema@2.0.0: {} @@ -10549,7 +10549,7 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jiti@1.21.3: {} + jiti@1.21.4: {} jju@1.4.0: {} @@ -10702,7 +10702,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lilconfig@3.1.1: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -10712,7 +10712,7 @@ snapshots: commander: 12.1.0 debug: 4.3.5 execa: 8.0.1 - lilconfig: 3.1.1 + lilconfig: 3.1.2 listr2: 8.2.1 micromatch: 4.0.7 pidtree: 0.6.0 @@ -12693,7 +12693,7 @@ snapshots: tsx@4.15.1: dependencies: - esbuild: 0.21.4 + esbuild: 0.21.5 get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 @@ -12784,7 +12784,7 @@ snapshots: ufo@1.5.3: {} - uglify-js@3.17.4: + uglify-js@3.18.0: optional: true umd@3.0.3: {} @@ -13012,7 +13012,7 @@ snapshots: transitivePeerDependencies: - supports-color - vue-router@4.3.2(vue@3.4.27(typescript@5.4.5)): + vue-router@4.3.3(vue@3.4.27(typescript@5.4.5)): dependencies: '@vue/devtools-api': 6.6.3 vue: 3.4.27(typescript@5.4.5) diff --git a/ui/web/package.json b/ui/web/package.json index 2d74c6ae..961a25fb 100644 --- a/ui/web/package.json +++ b/ui/web/package.json @@ -30,7 +30,7 @@ "finalhandler": "^1.2.0", "serve-static": "^1.15.0", "vue": "^3.4.27", - "vue-router": "^4.3.2", + "vue-router": "^4.3.3", "vue-toast-notification": "^3.1.2" }, "devDependencies": { -- 2.34.1 From c9a92ed7a2ef6d5258f075620b7f4878ba12c454 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 16:20:09 +0200 Subject: [PATCH 10/16] build: apply volta pnpm update MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- package.json | 4 ++-- ui/web/package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index bfafde93..a8eff286 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,9 @@ }, "volta": { "node": "22.2.0", - "pnpm": "9.2.0" + "pnpm": "9.3.0" }, - "packageManager": "pnpm@9.2.0", + "packageManager": "pnpm@9.3.0", "repository": { "type": "git", "url": "https://github.com/sap/e-mobility-charging-stations-simulator.git" diff --git a/ui/web/package.json b/ui/web/package.json index 961a25fb..f9fa3526 100644 --- a/ui/web/package.json +++ b/ui/web/package.json @@ -9,9 +9,9 @@ }, "volta": { "node": "22.2.0", - "pnpm": "9.2.0" + "pnpm": "9.3.0" }, - "packageManager": "pnpm@9.2.0", + "packageManager": "pnpm@9.3.0", "type": "module", "scripts": { "build": "vite build", -- 2.34.1 From 21f68e222da0b9ac5d43a70b96beaf3f13ff3926 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 17:11:34 +0200 Subject: [PATCH 11/16] refactor: cleanup power limitation code MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- src/charging-station/Helpers.ts | 40 +++++++++++++++++---------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/charging-station/Helpers.ts b/src/charging-station/Helpers.ts index cc0422e1..6163f678 100644 --- a/src/charging-station/Helpers.ts +++ b/src/charging-station/Helpers.ts @@ -715,7 +715,7 @@ export const getConnectorChargingProfilesLimit = ( chargingProfiles ) if (chargingProfilesLimit != null) { - let limit = buildChargingProfilesLimit(chargingStation, chargingProfilesLimit) + const limit = buildChargingProfilesLimit(chargingStation, chargingProfilesLimit) const connectorMaximumPower = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion chargingStation.stationInfo!.maximumPower! / chargingStation.powerDivider! @@ -726,7 +726,7 @@ export const getConnectorChargingProfilesLimit = ( } limit ${limit} is greater than connector ${connectorId} maximum ${connectorMaximumPower}: %j`, chargingProfilesLimit ) - limit = connectorMaximumPower + return connectorMaximumPower } return limit } @@ -737,27 +737,29 @@ const buildChargingProfilesLimit = ( chargingStation: ChargingStation, chargingProfilesLimit: ChargingProfilesLimit ): number => { - let { limit, chargingProfile } = chargingProfilesLimit + const errorMsg = `Unknown ${chargingStation.stationInfo?.currentOutType} currentOutType in charging station information, cannot build charging profiles limit` + const { limit, chargingProfile } = chargingProfilesLimit switch (chargingStation.stationInfo?.currentOutType) { case CurrentType.AC: - limit = - chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT - ? limit - : ACElectricUtils.powerTotal( - chargingStation.getNumberOfPhases(), - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - chargingStation.stationInfo.voltageOut!, - limit - ) - break + return chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT + ? limit + : ACElectricUtils.powerTotal( + chargingStation.getNumberOfPhases(), + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + chargingStation.stationInfo.voltageOut!, + limit + ) case CurrentType.DC: - limit = - chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT - ? limit - : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - DCElectricUtils.power(chargingStation.stationInfo.voltageOut!, limit) + return chargingProfile.chargingSchedule.chargingRateUnit === ChargingRateUnitType.WATT + ? limit + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + DCElectricUtils.power(chargingStation.stationInfo.voltageOut!, limit) + default: + logger.error( + `${chargingStation.logPrefix()} ${moduleName}.buildChargingProfilesLimit: ${errorMsg}` + ) + throw new BaseError(errorMsg) } - return limit } export const getDefaultVoltageOut = ( -- 2.34.1 From 1056f1b4cf5e305c45351093cb062d05468c83e8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 17:29:45 +0200 Subject: [PATCH 12/16] build(deps-dev): apply updates MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- pnpm-lock.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d392c6c9..47efa9ba 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -860,6 +860,7 @@ packages: '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -867,6 +868,7 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} @@ -3856,8 +3858,8 @@ packages: resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jiti@1.21.4: - resolution: {integrity: sha512-DUP4hpE2Of384xS46IiRm1JK3r4Ix4ADQI5k65y4joiZF7Oeo2ySdYG7PbqioljFalu1ndzto0Sb5IfExYliYA==} + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true jju@1.4.0: @@ -8606,7 +8608,7 @@ snapshots: dependencies: '@types/node': 20.14.2 cosmiconfig: 9.0.0(typescript@5.4.5) - jiti: 1.21.4 + jiti: 1.21.6 typescript: 5.4.5 cosmiconfig@9.0.0(typescript@5.4.5): @@ -10549,7 +10551,7 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jiti@1.21.4: {} + jiti@1.21.6: {} jju@1.4.0: {} -- 2.34.1 From 5d42650b5661ded13bc4a7f5b938f2b914410b18 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 17:30:35 +0200 Subject: [PATCH 13/16] chore: version 1.3.6 --- CHANGELOG.md | 15 ++++++++++++++- package.json | 2 +- sonar-project.properties | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a0f9b85..832d877b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,18 @@ # Changelog -## [v1.3.5](https://github.com/sap/e-mobility-charging-stations-simulator/compare/v1.3.4...v1.3.5) +## [v1.3.6](https://github.com/sap/e-mobility-charging-stations-simulator/compare/v1.3.5...v1.3.6) + +- build(deps-dev): apply updates [`01ffb6d`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/01ffb6d3583ab4da138dad815803121f3cc6d336) +- feat: handle CHARGE_POINT_MAX_PROFILE charging profiles at power [`3579910`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/357991053f9d8910cdfaebde426eca58f813c05f) +- build(deps-dev): apply updates [`7b0a334`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/7b0a334d2c0e42768b246cbc962718d605ca7464) +- refactor: cleanup power limitation code [`21f68e2`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/21f68e222da0b9ac5d43a70b96beaf3f13ff3926) +- refactor: cleanup charging profiles handling code [`c76d9c8`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/c76d9c83dba681eeccd78dcfae661b085d7ccf2b) +- fix: ensure no charging profile purpose TxProfile is loaded at startup [`3edfdf5`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/3edfdf53dc3c75bf26b4737bb014e6e98239ef38) +- build(deps-dev): apply updates [`1056f1b`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/1056f1b4cf5e305c45351093cb062d05468c83e8) +- build: apply volta pnpm update [`c9a92ed`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/c9a92ed7a2ef6d5258f075620b7f4878ba12c454) +- fix: fix TxProfile removal with transaction id defined at Tx stop [`d020e24`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/d020e249e5206699107d6e63d3d585a7e72e7830) + +## [v1.3.5](https://github.com/sap/e-mobility-charging-stations-simulator/compare/v1.3.4...v1.3.5) (2024-06-09) - test: add ErrorUtils test [`d05b53c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/d05b53c7a03b8fad2e106caee68d5871cc6aac6e) - test: improve ErrorUtils coverage [`2d4928a`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/2d4928a7237a906158f2e9652e08f0392eeabdcd) @@ -9,6 +21,7 @@ - build(deps-dev): apply updates [`65b608f`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/65b608f0259f6f59138406ea327d22ecd6a19361) - test: add tests [`b49550e`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/b49550e256d11c7a30fb19cd672e5e3611d01553) - test: improve coverage on existing tests [`ff40d2c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/ff40d2cc466140d6f18bc15b742100dd4f060d0f) +- chore: version 1.3.5 [`cc04ce3`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/cc04ce3549100de93505abdd6ff43fd3d968998d) - fix: restart metervalues interval if MeterValueSampleInterval is changed [`b8e3363`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/b8e3363a179fcf79d8bb66f47724b377d4d38a75) - refactor: rename Storage.handleDBError -> Storage.handleDBStorageError [`a03b18c`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/a03b18c4731bfd1173ff67b74a75684d3f6bb470) - fix: allow to set charging profile with TxProfile purpose [`65099c1`](https://github.com/sap/e-mobility-charging-stations-simulator/commit/65099c1e7297b252523172096a8d6ded22daa702) diff --git a/package.json b/package.json index a8eff286..1f1082f5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "e-mobility-charging-stations-simulator", - "version": "1.3.5", + "version": "1.3.6", "engines": { "node": ">=18.18.0", "pnpm": ">=9.0.0" diff --git a/sonar-project.properties b/sonar-project.properties index 6b31499a..d614cceb 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -3,7 +3,7 @@ sonar.organization=sap-1 # This is the name and version displayed in the SonarCloud UI. sonar.projectName=e-mobility-charging-stations-simulator -sonar.projectVersion=1.3.5 +sonar.projectVersion=1.3.6 # Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. sonar.sources=src -- 2.34.1 From 8df621e643de566c4eae6608ed9cfcc8271bd3aa Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 17:46:09 +0200 Subject: [PATCH 14/16] build(deps-dev): apply updates MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- package.json | 2 +- pnpm-lock.yaml | 24 +++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 1f1082f5..db7a0526 100644 --- a/package.json +++ b/package.json @@ -127,7 +127,7 @@ "@typescript-eslint/eslint-plugin": "^7.12.0", "@typescript-eslint/parser": "^7.12.0", "auto-changelog": "^2.4.0", - "c8": "^9.1.0", + "c8": "^10.0.0", "clinic": "^13.0.0", "cross-env": "^7.0.3", "esbuild": "^0.21.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47efa9ba..8fdf1d9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -113,8 +113,8 @@ importers: specifier: ^2.4.0 version: 2.4.0(encoding@0.1.13) c8: - specifier: ^9.1.0 - version: 9.1.0 + specifier: ^10.0.0 + version: 10.0.0 clinic: specifier: ^13.0.0 version: 13.0.0(encoding@0.1.13) @@ -1861,9 +1861,9 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} - c8@9.1.0: - resolution: {integrity: sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==} - engines: {node: '>=14.14.0'} + c8@10.0.0: + resolution: {integrity: sha512-rdQecjxw16P8kwgMBjruaQyfF+R2o/mucCCK4VPktwq2HFMWLOHGyUasb46+WlUOVJX94d6dZolcJxzjCzWmXg==} + engines: {node: '>=18'} hasBin: true cac@6.7.14: @@ -5674,6 +5674,10 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -8223,7 +8227,7 @@ snapshots: dependencies: run-applescript: 7.0.0 - c8@9.1.0: + c8@10.0.0: dependencies: '@bcoe/v8-coverage': 0.2.3 '@istanbuljs/schema': 0.1.3 @@ -8232,7 +8236,7 @@ snapshots: istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.1.7 - test-exclude: 6.0.0 + test-exclude: 7.0.1 v8-to-istanbul: 9.2.0 yargs: 17.7.2 yargs-parser: 21.1.1 @@ -12570,6 +12574,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + test-exclude@7.0.1: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 10.4.1 + minimatch: 9.0.4 + text-extensions@2.4.0: {} text-hex@1.0.0: {} -- 2.34.1 From dd4588bbff2b31d206367724d0aa843ecc7ef7c6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 18:59:21 +0200 Subject: [PATCH 15/16] refactor: refine OCPP 2 mock server defaults MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- tests/ocpp-server/README.md | 3 ++- tests/ocpp-server/server.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/ocpp-server/README.md b/tests/ocpp-server/README.md index e02d8b7b..cd6d2e5d 100644 --- a/tests/ocpp-server/README.md +++ b/tests/ocpp-server/README.md @@ -1,6 +1,6 @@ # OCPP2 Mock Server -This project includes a mock Open Charge Point Protocol (OCPP) version 2.0.1 server implemented in Python. +This project includes an Open Charge Point Protocol (OCPP) version 2.0.1 mock server implemented in Python. ## Prerequisites @@ -10,6 +10,7 @@ This project requires Python 3.7+ and the following Python packages: - `ocpp` You can install these packages using pip: + ``` pip install websockets ocpp ``` diff --git a/tests/ocpp-server/server.py b/tests/ocpp-server/server.py index 87bb2e30..2bba45dd 100644 --- a/tests/ocpp-server/server.py +++ b/tests/ocpp-server/server.py @@ -75,9 +75,9 @@ async def main(): # Create the WebSocket server and specify the handler for new connections. server = await websockets.serve( on_connect, - '0.0.0.0', # Listen on all available interfaces. + '0.0.0.0', # Listen on loopback. 9000, # Port number. - subprotocols=['ocpp2.0.1'] # Specify the OCPP 2.0.1 subprotocol. + subprotocols=['ocpp2.0', 'ocpp2.0.1'] # Specify OCPP 2.0.1 subprotocols. ) logging.info("WebSocket Server Started") # Wait for the server to close (runs indefinitely). -- 2.34.1 From c11be92a38d40495df5ec37b9ff946993c4dc84f Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Mon, 10 Jun 2024 20:37:18 +0200 Subject: [PATCH 16/16] test: migrate ocpp server to poetry to ease usage MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Jérôme Benoit --- tests/ocpp-server/README.md | 11 +- tests/ocpp-server/poetry.lock | 278 +++++++++++++++++++++++++++++++ tests/ocpp-server/pyproject.toml | 16 ++ tests/ocpp-server/server.py | 7 +- 4 files changed, 301 insertions(+), 11 deletions(-) create mode 100644 tests/ocpp-server/poetry.lock create mode 100644 tests/ocpp-server/pyproject.toml diff --git a/tests/ocpp-server/README.md b/tests/ocpp-server/README.md index cd6d2e5d..332751d5 100644 --- a/tests/ocpp-server/README.md +++ b/tests/ocpp-server/README.md @@ -4,15 +4,10 @@ This project includes an Open Charge Point Protocol (OCPP) version 2.0.1 mock se ## Prerequisites -This project requires Python 3.7+ and the following Python packages: - -- `websockets` -- `ocpp` - -You can install these packages using pip: +This project requires Python 3.7+ and [poetry](https://python-poetry.org/) to install the required packages: ``` -pip install websockets ocpp +poetry install ``` ## Running the Server @@ -35,7 +30,7 @@ The server script uses the websockets and ocpp libraries to facilitate the WebSo ## Note -Primarily, this software is intended for testing applications. The server scripts don't execute full OCPP adherence and it is advised not to use them in a production environment without additional development. +Primarily, this software is intended for testing applications. The server script don't adhere to the full OCPP specifications and it is advised not to use them in a production environment without additional development. For reference: https://github.com/mobilityhouse/ocpp diff --git a/tests/ocpp-server/poetry.lock b/tests/ocpp-server/poetry.lock new file mode 100644 index 00000000..3bcabcc1 --- /dev/null +++ b/tests/ocpp-server/poetry.lock @@ -0,0 +1,278 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "jsonschema" +version = "4.22.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.22.0-py3-none-any.whl", hash = "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"}, + {file = "jsonschema-4.22.0.tar.gz", hash = "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "ocpp" +version = "2.0.0rc1" +description = "Python package implementing the JSON version of the Open Charge Point Protocol (OCPP)." +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "ocpp-2.0.0rc1-py3-none-any.whl", hash = "sha256:c3c99483eb3985c069e230fe9f230fbe448cadc2d56f8dbf4c7ca10c8ddfd755"}, + {file = "ocpp-2.0.0rc1.tar.gz", hash = "sha256:67a4b1f662dbd17bac248a31211999b89b52575abca277baa243b62e16b0ec4d"}, +] + +[package.dependencies] +jsonschema = ">=4.4.0,<5.0.0" + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "rpds-py" +version = "0.18.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53"}, + {file = "rpds_py-0.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0"}, + {file = "rpds_py-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da"}, + {file = "rpds_py-0.18.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1"}, + {file = "rpds_py-0.18.1-cp310-none-win32.whl", hash = "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333"}, + {file = "rpds_py-0.18.1-cp310-none-win_amd64.whl", hash = "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8"}, + {file = "rpds_py-0.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100"}, + {file = "rpds_py-0.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e"}, + {file = "rpds_py-0.18.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88"}, + {file = "rpds_py-0.18.1-cp311-none-win32.whl", hash = "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb"}, + {file = "rpds_py-0.18.1-cp311-none-win_amd64.whl", hash = "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3"}, + {file = "rpds_py-0.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8"}, + {file = "rpds_py-0.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac"}, + {file = "rpds_py-0.18.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a"}, + {file = "rpds_py-0.18.1-cp312-none-win32.whl", hash = "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6"}, + {file = "rpds_py-0.18.1-cp312-none-win_amd64.whl", hash = "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74"}, + {file = "rpds_py-0.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5"}, + {file = "rpds_py-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e"}, + {file = "rpds_py-0.18.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc"}, + {file = "rpds_py-0.18.1-cp38-none-win32.whl", hash = "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9"}, + {file = "rpds_py-0.18.1-cp38-none-win_amd64.whl", hash = "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93"}, + {file = "rpds_py-0.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab"}, + {file = "rpds_py-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b"}, + {file = "rpds_py-0.18.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26"}, + {file = "rpds_py-0.18.1-cp39-none-win32.whl", hash = "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360"}, + {file = "rpds_py-0.18.1-cp39-none-win_amd64.whl", hash = "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c"}, + {file = "rpds_py-0.18.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909"}, + {file = "rpds_py-0.18.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49"}, + {file = "rpds_py-0.18.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e"}, + {file = "rpds_py-0.18.1.tar.gz", hash = "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f"}, +] + +[[package]] +name = "websockets" +version = "12.0" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.12" +content-hash = "e76eceb912dc1457ae116b3ecc0f0fc5a58ae23d2c2652dcd69b4cd9df207099" diff --git a/tests/ocpp-server/pyproject.toml b/tests/ocpp-server/pyproject.toml new file mode 100644 index 00000000..e1a30e5b --- /dev/null +++ b/tests/ocpp-server/pyproject.toml @@ -0,0 +1,16 @@ +[tool.poetry] +name = "ocpp-server" +version = "0.1.0" +description = "" +authors = ["Jérôme Benoit "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.12" +websockets = "^12.0" +ocpp = "^2.0.0rc1" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/tests/ocpp-server/server.py b/tests/ocpp-server/server.py index 2bba45dd..e8e1e6af 100644 --- a/tests/ocpp-server/server.py +++ b/tests/ocpp-server/server.py @@ -48,7 +48,8 @@ class ChargePoint(cp): # Function to handle new WebSocket connections. async def on_connect(websocket, path): - """ For every new charge point that connects, create a ChargePoint instance and start listening for messages. """ + """ For every new charge point that connects, create a ChargePoint instance and start + listening for messages.""" try: requested_protocols = websocket.request_headers['Sec-WebSocket-Protocol'] except KeyError: @@ -75,8 +76,8 @@ async def main(): # Create the WebSocket server and specify the handler for new connections. server = await websockets.serve( on_connect, - '0.0.0.0', # Listen on loopback. - 9000, # Port number. + '127.0.0.1', # Listen on loopback. + 9000, # Port number. subprotocols=['ocpp2.0', 'ocpp2.0.1'] # Specify OCPP 2.0.1 subprotocols. ) logging.info("WebSocket Server Started") -- 2.34.1