Google Sign-In Required

Use your company Google account to access the BetterFleet private content.

Back to private home

BetterFleet Support Private
Skip to content
BetterFleet Dev Wiki
Specification: Enable Scheduled Managed Charger Access
Initializing search
    bf-dev
    • Home
    • Process
    • Products
    • Reference
    • Decisions
    • Work
    • Operations
    bf-dev
    • Home
      • Process Handbook
      • BetterFleet Workflow Map
      • Product Development System
      • Product Engineering Workflow
        • Process Workflows
        • Work Intake and Weekly Planning
        • Product Engineering Workflow in Linear
        • Product Engineering Delivery
        • Agent Guidance
        • Workflow
        • Skills
        • Skill Sources
        • Process Guides
        • GitLab Feature Flags
        • In-App Docs Authoring
        • Release Notes
        • Process Templates
        • Release Plan: <title>
      • Process Publishing
      • Product overview
        • General Reference
          • Core Domain Training
          • System Topology
          • Two-Axis Ontology Model
          • Ontology Primer
          • Worked Example
          • Evidence, Ownership, and Lineage
          • Energy Management
          • Standards and Protocol Map
          • Charging, Roaming, and Commercial Model
          • Charge Planning and Operations
          • Cross-Cutting Domains
          • Domain Coverage Matrix
        • BetterFleet Product Ontology
        • Core Operations Data Ontology
        • BetterFleet R&D Plan
        • Index
        • Architecture
        • Manage Product Capabilities
        • Manage Data and State
        • Manage Service Interaction Flows
        • Manage Reference
        • Manage Internal Application Diagrams
          • Manage Authorization And Permissions
          • bf-manage-core Auth and Authorization Model
          • Manage Authorization and Permissions
          • bf-manage-web Auth and Permission Model
          • Manage Service Catalog
          • bf-depot-sim
          • bf-digital-twin (Manage Role)
          • bf-fleet-health
          • bf-manage-connect
          • bf-manage-core
          • bf-manage-incidents
          • bf-manage-roaming
          • bf-manage-sitepwrmon
          • bf-manage-web
          • bf-schedule-creator (Manage Role)
          • bf-support-microsite
          • bf-telematics
        • Index
        • Architecture
        • Plan Reference
        • Plan Internal Application Diagrams
        • Plan Migration and Flags
        • Plan Simulation Request Lifecycle
          • Plan Service Catalog
          • bf-bnl-schedule-analysis-compute
          • bf-bnl-settings
          • bf-bnl-ui
          • bf-digital-twin (Plan Role)
          • bf-route-modelling
          • bf-schedule-creator (Plan Role)
      • Where to Ask Product Questions
      • Reference
        • Platform Reference
        • Platform Architecture
        • Script Runtime Model
        • Compose Profiles and Modes
        • Repository Map
        • Monolithic Git Transition FAQ
        • Monolithic Git Sizing
        • CI and Release Integration
        • Shared Reference
        • Shared Infrastructure Architecture
        • Secrets and Env Strategy
        • Vendors and Local Dependencies
        • System Reference
        • Cloud Data Dependencies
        • Ports and URLs
        • Service Matrix
          • API Docs
          • OCPI API Docs
          • OCPP API Docs
          • OSCP API Docs
          • VDV API Docs
          • Yard State API Docs
        • System Design
        • System Design: BBA Microgrid Controller Generic Packet Translation
        • System Design: Depot Simulation
        • System Design: IoT Sensor Packet
        • System Design: Microgrid Energy Orchestration
          • System Design: OCPP Profile 3 And ISO 15118 PKI
          • Architecture: BetterFleet OCPP Profile 3 and ISO 15118 PKI
          • Specification: BetterFleet OCPP Profile 3 and ISO 15118 Certificate Lifecycle Management
          • System Design: On-Prem Control
          • Challenge
          • Specification: BetterFleet On-Prem Continuity Control
          • System Design: OSCP
          • OSCP Protocol Documentation
          • Depot Sim Testing Requirements
          • System Design: OSCP Flexibility Provider Domain
      • Decisions
        • Architecture Decision Records
        • 0001 - Record architecture decisions
        • 0002 - Cognito for Authentication and Authorisation
        • 0003 - AWS Amplify for Authentication
        • 0004 - DynamoDB for default database
        • 0005 - Data Persistence
        • 0006 - Trunk-Based Development
        • 0007 - Generalised principle for automation
        • 0008 - Naming Repositories, Services, and URLs
        • 0009 - Use Timezone Aware DateTimes and UTC
        • 0010 - Use semantic release
        • 0011 - Centralized feature flag repository
        • 0012 - Use Named Exports in Storybook
        • 0013 - RESTful TITLE GraphQL
        • 0014 - Service Granularity
        • 0015 - Async/co-routine exception handling pattern
        • 0016 - Logging & log levels
        • 0017 - Instantiated Models
        • 0018 - Repository Pattern for Database Access
        • 0019 - Use of Design Tokens in TypeScript React Application
        • 0020 - API backwards compatibility and versioning
        • 0021 - Alembic Migration strategy
        • 0022 - Consistent react-hook-form usage
        • 0023 - Domain Event-Driven Architecture
        • 0024 - Domain Event Bus Tech Stack
        • 0025 - No enum types in DB table columns
        • 0026 - In-Memory Ormar Stores for Repository testing
        • 0027 - Storing Tab State in Query and Local Storage
        • 0028 - Adopt OpenTelemetry Semantic Conventions for Structured Logging
        • 0029 - Adopt RFC 9457 for HTTP Error Responses
        • 0030 - Use GitLab registry and Terraform state for ECS services
        • 0031 - Adopt DDD, Hexagonal Architecture, and CQRS for Python Domain Services
      • Work
        • Active Work
          • Work: Bba Microgrid Controller
          • Implementation Specification: BBA Microgrid Controller
          • BBA Microgrid Controller Deliverables (Stories)
          • Work: BFDev Monolithic Git
          • Challenge
          • Specification: BFDev Monolithic Git v2
          • BFDev Monolithic Git v2 Stories
          • Work: Complex Circuit Load Balancing
          • Implementation Specification: Complex Circuit Load Balancing
          • Complex Circuit Load Balancing Deliverables (Stories)
            • COR-10 and COR-11 Consolidation Review
          • Work: Dispatch Reliability and Reconciliation
          • Challenge
          • Specification: Dispatch Reliability and Reconciliation
          • Dispatch Reliability and Reconciliation (Unit User Stories)
            • Dispatch populated vehicle cards grey surface snapshot
            • Dispatch Visual Review
          • Work: Enable Scheduled Managed Charger Access
          • Challenge: Enable Scheduled Managed Charger Access
          • Specification Exploration Dossier: Enable Scheduled Managed Charger Access
          • Specification Review: Enable Scheduled Managed Charger Access
          • Specification: Enable Scheduled Managed Charger Access
            • TLDR (Solution Summary)
            • 1. Summary
            • 2. Users and Use Cases
            • 3. Conceptual Model Terms and Decisions
              • Key Terms
              • Decision Ledger
            • 4. Domain Model and Eventstorming (Conceptual)
              • Interaction Flow
              • Event Timeline
              • Event Dictionary
            • 5. Requirements and Constraints
            • 6. Interaction and Flow
              • Access Schedule Configuration
              • Managed-Access Authorisation
              • Access Mode State
            • 7. Non-Technical Implementation Approach
            • 8. Open Questions
            • 9. Appendices
          • Work: Guided Cut-Off and Release Orchestration
          • Specification: Guided Cut-Off and Release Orchestration
          • Guided Cut-Off and Release Orchestration (Unit User Stories)
          • Work: Production Deployment Validation
          • Challenge
          • Work: Scheduled Report Parity
          • Specification: Scheduled Report Parity
          • Work: Telematics
          • Telematics EventBridge Path
          • Telematics Ingress Architecture
          • Specification: Telematics Migration into bf-manage-core with 5-Minute Freshness and Health Visibility
          • Telematics Core Migration MVP (Implementation-Time BDD)
          • Work: Vector Derms
          • Implementation Specification: Vector DERMS
          • Vector DERMS Deliverables (Stories)
          • Work: Visiting Vehicle Charging Visibility
          • Specification: Visiting Vehicle Charging Visibility
          • Visiting Vehicle Charging Visibility (Unit User Stories)
          • Work: Workspace Owned Stripe Roaming
          • Specification: Workspace-Owned Stripe Credentials for Roaming Payments
        • Backlog Work
          • Work: Microgrid
          • Microgrid Backlog Stories
          • Work: Mobile Ops Companion
          • Challenge
          • Specification: Mobile Operations Companion v1
          • Mobile Operations Companion Deliverables (Stories)
          • Work: Oscp
          • OSCP Backlog Stories
        • Archived Work
          • Work: Code Canonical Orchestration
          • Challenge
          • Specification: Product Engineering Workflow
          • Product Engineering Workflow Deliverables (Unit User Stories)
          • Work: Release Notes Automation
          • Release Plan: Release Notes Automation
          • Release Notes Automation Backlog Stories
      • Operations
      • Onboarding Runbook
        • Operations Runbooks
        • Production Hotfix Release
        • Staging Hotfix Release
        • Manage Staging Release Validation
        • Terraform Plan Dry Runs
        • Operations Tooling
        • Code Indexing
        • Operations Evidence
        • Database Restoration Test Report
      • Daily Operations Runbook
      • Testing Guide
      • Troubleshooting
    • TLDR (Solution Summary)
    • 1. Summary
    • 2. Users and Use Cases
    • 3. Conceptual Model Terms and Decisions
      • Key Terms
      • Decision Ledger
    • 4. Domain Model and Eventstorming (Conceptual)
      • Interaction Flow
      • Event Timeline
      • Event Dictionary
    • 5. Requirements and Constraints
    • 6. Interaction and Flow
      • Access Schedule Configuration
      • Managed-Access Authorisation
      • Access Mode State
    • 7. Non-Technical Implementation Approach
    • 8. Open Questions
    • 9. Appendices
    1. Home
    2. Work
    3. Active
    4. Enable scheduled managed charger access

    Specification: Enable Scheduled Managed Charger Access¶

    TLDR (Solution Summary)¶

    • Build scheduled charger access control so depot operators can put chargers into freevend during open periods and managed access during restricted periods, with BetterFleet authorising own-fleet and agreement vehicles while recording unauthorised attempts as access denied.
    • Charger access mode + add scheduled freevend and managed access states per charger + chargers follow depot operating patterns automatically.
    • Access schedule + add recurring charger-level rules with timezone-aware effective times + operators can define when each charger requires authorisation.
    • Authorised vehicle identifier set + classify identifiers as own-fleet, agreement, or unauthorised/unknown + managed-access attempts can be allowed or denied consistently.
    • Access decision record + record each managed-access allow or deny outcome separately from faults and incidents + operations users can distinguish policy enforcement from charger failure.
    • Denial signalling contract + define the supported charger or vehicle-facing denial response per protocol capability + drivers get the clearest available denial signal.

    1. Summary¶

    • Problem statement:
    • Depot operators need chargers to be openly available at some times and restricted at others, but the current challenge does not define a product model for scheduled switching between freevend and managed access.
    • During restricted periods, BetterFleet needs a reliable access decision model that allows known own-fleet and agreement vehicles, denies unknown vehicles, and records denials as policy outcomes rather than charger faults.
    • Goal and success criteria:
    • Define a scheduled managed charger access capability for BetterFleet Manage and charger integrations.
    • Success is measured by:
      • operators being able to configure recurring charger-level managed-access periods;
      • chargers entering the expected access mode at scheduled times;
      • managed-access attempts producing correct allow or deny decisions for own-fleet, agreement, and unknown identifiers;
      • operations users seeing access-denied events separately from incidents and charger faults;
      • the product defining the denial signal available to drivers or charger users for each supported charger/protocol path.
    • What will be built in this phase:
    • Charger access mode + expose freevend and managed access as the effective access mode for each charger + users and systems can tell whether BetterFleet authorisation is required.
    • Access schedule + allow recurring charger-level rules using account or depot-local time + chargers switch access mode without manual intervention.
    • Managed-access authorisation + evaluate charger-provided vehicle identifiers against own-fleet and agreement vehicle identifier sets + allowed vehicles can start charging during restricted periods.
    • Access-denied event + record denied attempts as access-control outcomes + operations users do not confuse denial with faults or incidents.
    • Denial signalling contract + define the expected denial response for each supported charger/protocol capability + drivers receive the clearest available indication that charging was denied by access rules.
    • Scope for this phase:
    • In:
      • charger-level access mode modelling;
      • recurring charger-level schedules for freevend versus managed access;
      • authorisation against own-fleet and agreement vehicle identifiers;
      • access-decision recording for allowed and denied attempts;
      • operations visibility for access-denied outcomes;
      • conceptual denial signalling per supported charger/protocol capability.
    • Out:
      • billing, tariff calculation, or settlement for agreement vehicles;
      • driver account management;
      • broad fleet-sharing marketplace behaviour;
      • depot-level, zone-level, or connector-level policy inheritance beyond what is needed for charger-level control;
      • agreement-vehicle import and agreement lifecycle management, except as a dependency that provides identifiers;
      • treating access denial as an incident by default.
    • Current baseline (as of May 1, 2026):
    • The Linear initiative states that chargers may be left in freevend when restricted access is needed.
    • Vehicle access rules are not yet clearly modelled around own vehicles, agreement vehicles, and unknown vehicles for this capability.
    • Access-denied attempts can be confused with charger failure because the product contract for policy denial is not defined.
    • Future evolution guardrails:
    • The model should allow later depot, zone, connector, and agreement-level policy layers without changing the meaning of charger-level rules.
    • The identifier model should allow multiple identifier types per vehicle and per charger integration.
    • Access decisions should remain auditable so later billing, settlement, reporting, or compliance work can consume them.
    • The schedule model should support recurring operating patterns without blocking later exceptions, holidays, or temporary overrides.

    2. Users and Use Cases¶

    • Primary personas:
    • Depot operator configuring which chargers are open and which are restricted.
    • Operations user monitoring charging attempts and diagnosing failures or denials.
    • Fleet or agreements administrator maintaining the vehicle identifiers that may charge during restricted periods.
    • Driver or end user attempting to charge during a managed-access period.
    • Support user investigating a failed or denied charging attempt.
    • High-level user stories:
    • As a depot operator, I want chargers to run in freevend during open-access periods so vehicles can charge without BetterFleet authorisation.
    • As a depot operator, I want chargers to switch to managed access during restricted periods so only own-fleet and agreement vehicles can charge.
    • As a depot operator, I want recurring schedules for charger access mode changes so normal operating patterns happen automatically.
    • As an operations user, I want denied attempts recorded as access denied so I can distinguish policy enforcement from charger faults.
    • As a support user, I want to see which identifier was denied and why so I can resolve misconfiguration or explain the outcome.
    • As a driver, I need the charger or vehicle experience to make clear that charging was denied where the charger and protocol support that feedback.
    • Edge cases and failure modes:
    • A charger is offline or unreachable when its scheduled access mode should change.
    • A charger integration cannot support remote freevend switching or pre-start authorisation.
    • A charger sends an identifier type BetterFleet does not recognise.
    • A vehicle has multiple identifiers, only one of which is known to BetterFleet.
    • An agreement vehicle's identifier is stale or missing.
    • A charging attempt starts near an access-mode boundary.
    • Two recurring access rules overlap for the same charger.
    • A scheduled managed-access period crosses midnight or a daylight-saving transition.
    • A denied attempt is followed by a legitimate charger fault.

    3. Conceptual Model Terms and Decisions¶

    Key Terms¶

    Term Definition Notes
    Charger Access Mode The effective behaviour of a charger for access control. freevend means local charger rules allow charging without a BetterFleet access decision; managed access means BetterFleet authorisation is required before charging starts.
    Freevend Open-access charger mode where BetterFleet does not decide each charging attempt. A charger may still report sessions and telemetry.
    Managed Access Restricted charger mode where charging attempts require a BetterFleet access decision. The charger or integration must support pre-start authorisation for this mode.
    Access Schedule A recurring rule that determines a charger's expected access mode at a time. Uses depot or account-local presentation time and UTC storage.
    Effective Access Mode The access mode that applies to a charger at a specific instant after schedules, overrides, and integration state are considered. First phase may omit manual overrides, but the term leaves room for them.
    Vehicle Identifier A charger-provided identifier used to recognise a vehicle or driver credential. Examples include MAC address, RFID, PIN, or another protocol-specific token.
    Own-Fleet Vehicle A vehicle belonging to the depot owner's fleet. Allowed during managed access when its identifier is known and active.
    Agreement Vehicle A vehicle from another fleet with an agreement to use the depot owner's chargers. Allowed during managed access when its identifier is known and active.
    Unknown Vehicle A vehicle whose identifier is not recognised. Denied during managed access.
    Access Decision The result of evaluating a charging attempt during managed access. Outcome is allowed or access denied.
    Access-Denied Event A recorded access decision denying a charging attempt because policy did not allow it. Separate from charger fault and incident concepts.
    Denial Signal The feedback relayed to the driver, charger, or vehicle when access is denied. Exact signal depends on charger and protocol capability.

    Decision Ledger¶

    ID Decision Rationale Alternatives Rejected Implications
    D-001 Scope the first phase to charger-level scheduled access mode. The challenge explicitly requires charger-level control and recurring schedules. Begin with depot-wide or connector-level policy. Later inheritance or connector policy must build on this model.
    D-002 Model freevend and managed access as explicit access modes. Operators need a clear mode contract and integrations need an unambiguous target state. Treat freevend as a hidden charger integration setting. UI, audit, and integration flows can share the same terms.
    D-003 Use recurring schedules to derive effective access mode. Normal depot operating patterns should happen automatically. Require manual switching for each period. Schedule evaluation, boundary handling, and timezone rules become core requirements.
    D-004 Allow own-fleet and agreement vehicles during managed access; deny unknown vehicles. This matches the challenge's access policy. Allow only own-fleet vehicles in the first release. Agreement vehicle identifiers are a dependency even if agreement management remains out of scope.
    D-005 Record denied attempts as access-denied events, not incidents by default. The challenge requires policy enforcement to be distinguishable from failure. Convert each denial into an incident or charger fault. Operations views need a separate denial presentation path.
    D-006 Keep driver-facing denial behaviour capability-dependent. Charger and protocol support will vary. Promise one universal denial signal before compatibility is known. The spec requires a denial signalling contract per supported integration path.
    D-007 Store and calculate schedule instants using timezone-aware rules and UTC internally. Aligns with ADR 0009 and avoids ambiguous boundary behaviour. Store naive local datetimes. UI must present local times, while persistence and evaluation use timezone-aware values.
    D-008 Prefer additive interfaces for charger access and decision data. Aligns with ADR 0020 and reduces disruption for existing charger consumers. Replace existing charger session or fault contracts with breaking changes. Delivery should add access-control fields and views where possible.

    4. Domain Model and Eventstorming (Conceptual)¶

    • Bounded context and ubiquitous language:
    • Charger Access Control governs access mode schedules, effective mode evaluation, charger access-mode changes, and managed-access decisions.
    • Vehicle Access Identity governs the mapping from charger-provided identifiers to own-fleet, agreement, and unknown access classes.
    • Charging Operations Visibility governs how allowed and denied attempts appear to operators and support users.
    • Aggregates and entities:
    • Charger: charging asset with supported access capabilities and effective access mode.
    • Access Schedule: recurring charger-level rule defining expected access mode over time.
    • Vehicle Access Identity: active identifier and access class used for authorisation.
    • Charging Access Attempt: a charger-reported attempt to start charging during managed access.
    • Access Decision: allowed or denied result with reason and identifier context.
    • Value objects:
    • Access Mode: freevend or managed_access.
    • Access Class: own_fleet, agreement, unknown, or unauthorised.
    • Schedule Window: recurring local-time window with timezone-aware interpretation.
    • Denial Reason: policy reason explaining why an attempt was denied.
    • Domain events and triggers:
    • AccessScheduleCreated when an operator creates a charger access schedule.
    • AccessScheduleUpdated when an operator changes a recurring rule.
    • EffectiveAccessModeEvaluated when the system determines which access mode applies now.
    • ChargerAccessModeChangeRequested when the system asks a charger or integration to switch mode.
    • ChargerAccessModeChanged when the charger reports or confirms the new mode.
    • ManagedAccessAttemptReceived when a charger requests authorisation before charging starts.
    • VehicleIdentifierClassified when BetterFleet maps the charger-provided identifier to an access class.
    • AccessDecisionRecorded when BetterFleet records an allow or deny decision.
    • AccessDeniedObserved when a denied attempt is surfaced to operations users.
    • Commands, actors, and policies:
    • ConfigureAccessSchedule by depot operator.
    • EvaluateEffectiveAccessMode by schedule policy.
    • ApplyAccessModeToCharger by charger integration policy.
    • RequestManagedAccessAuthorisation by charger or integration.
    • ClassifyVehicleIdentifier by vehicle identity policy.
    • RecordAccessDecision by access-control policy.
    • ShowAccessDeniedOutcome by operations visibility policy.
    • Invariants and business rules enforced:
    • A charger with effective mode freevend must not require a BetterFleet access decision before charging starts.
    • A charger with effective mode managed_access must require a BetterFleet access decision before charging starts when the charger supports that path.
    • Own-fleet and agreement identifiers must be allowed during managed access when active and valid.
    • Unknown or unauthorised identifiers must be denied during managed access.
    • A denied access attempt must be recorded as an access-denied event and must not be recorded as a charger fault or incident by default.
    • Access schedule evaluation must use timezone-aware rules and store internal instants in UTC.
    • Overlapping access schedules for the same charger must be prevented or resolved by an explicit priority rule.
    • Access decisions must retain enough context for support users to explain the outcome without exposing sensitive identifiers unnecessarily.
    • External systems and integrations:
    • Charger integrations must expose whether freevend switching and pre-start authorisation are supported.
    • Vehicle and agreement systems must provide or expose authorised identifiers.
    • Operations views must consume access-decision records separately from charger fault and incident streams.

    Interaction Flow¶

    flowchart LR
      Operator["Depot operator"] --> Configure["Configure charger access schedule"]
      Configure --> Schedule["Access schedule saved"]
      Schedule --> Evaluate["Evaluate effective access mode"]
      Evaluate --> Apply["Request charger access mode change"]
      Apply --> Mode["Charger runs in freevend or managed access"]
      Mode --> Attempt["Charging attempt received"]
      Attempt --> Managed{"Managed access active?"}
      Managed -->|No| Freevend["Charging follows charger freevend behaviour"]
      Managed -->|Yes| Classify["Classify vehicle identifier"]
      Classify --> Decision{"Own-fleet or agreement?"}
      Decision -->|Yes| Allow["Record allowed decision and permit start"]
      Decision -->|No| Deny["Record access-denied event and deny start"]
      Deny --> Ops["Show access denied in operations views"]

    Event Timeline¶

    timeline
      title Scheduled Managed Charger Access
      AccessScheduleCreated: Operator defines recurring charger access mode periods
      EffectiveAccessModeEvaluated: System determines the current charger mode
      ChargerAccessModeChangeRequested: Integration is asked to switch mode
      ChargerAccessModeChanged: Charger confirms or reports effective mode
      ManagedAccessAttemptReceived: Charger asks for authorisation
      VehicleIdentifierClassified: Identifier maps to own-fleet, agreement, or unknown
      AccessDecisionRecorded: Allow or deny decision is stored
      AccessDeniedObserved: Operations user sees policy denial separately from faults

    Event Dictionary¶

    • AccessScheduleCreated: a recurring charger access rule was created | starts automated access-mode control | chargerId, accessMode, recurrence, timezone, createdAt | triggers future schedule evaluation.
    • AccessScheduleUpdated: a recurring charger access rule was changed | keeps operating pattern current | scheduleId, changedFields, updatedAt | triggers re-evaluation.
    • EffectiveAccessModeEvaluated: the current mode for a charger was derived | defines whether authorisation is required | chargerId, effectiveAt, accessMode, sourceScheduleId | may trigger mode change.
    • ChargerAccessModeChangeRequested: the system requested freevend or managed access on the charger | applies the schedule to the physical charger | chargerId, requestedMode, requestedAt | awaits confirmation or error.
    • ChargerAccessModeChanged: charger mode was confirmed or reported | confirms operational state | chargerId, accessMode, changedAt | updates visibility and audit.
    • ManagedAccessAttemptReceived: a charger requested authorisation | starts policy decision | chargerId, identifierType, identifierHash, receivedAt | triggers classification.
    • VehicleIdentifierClassified: an identifier was mapped to an access class | explains policy basis | identifierType, accessClass, matchedVehicleId | feeds access decision.
    • AccessDecisionRecorded: an allow or deny decision was stored | creates audit and operations visibility | chargerId, accessClass, decision, reason, decidedAt | allows start or reports denial.
    • AccessDeniedObserved: a denied attempt was surfaced to a user | separates policy denial from failure | decisionId, chargerId, observedAt | supports monitoring and support.

    5. Requirements and Constraints¶

    • Functional requirements:
    • FR-001: The system shall represent each supported charger access mode as freevend or managed access.
    • FR-002: Operators shall be able to configure recurring charger-level access schedules that set expected access mode over time.
    • FR-003: Access schedules shall use depot or account-local presentation time while storing and evaluating effective instants with timezone-aware UTC semantics.
    • FR-004: The system shall derive a charger's effective access mode from its applicable schedule at the time of evaluation.
    • FR-005: The system shall request charger mode changes when a schedule boundary changes a charger's effective access mode and the charger integration supports remote mode switching.
    • FR-006: The product shall expose charger capability status for remote freevend switching and managed-access authorisation before a charger can be treated as fully supported.
    • FR-007: During managed access, the system shall evaluate charger-provided vehicle identifiers before allowing charging to start.
    • FR-008: The system shall allow active own-fleet vehicle identifiers during managed-access periods.
    • FR-009: The system shall allow active agreement vehicle identifiers during managed-access periods.
    • FR-010: The system shall deny unknown or unauthorised identifiers during managed-access periods.
    • FR-011: The system shall record each managed-access authorisation outcome as an access decision with enough context to support operational review.
    • FR-012: The system shall record managed-access denials as access-denied events, separate from charger faults and incidents by default.
    • FR-013: Operations users shall be able to see access-denied events for relevant chargers and distinguish them from faults.
    • FR-014: Support users shall be able to identify the charger, time, identifier class, and denial reason for a denied attempt without exposing sensitive identifiers unnecessarily.
    • FR-015: The product shall define the denial signal sent to the charger, vehicle, or driver for each supported charger/protocol path.
    • FR-016: Overlapping access schedules for the same charger shall be prevented or resolved through an explicit priority rule visible to operators.
    • FR-017: A failed charger mode change shall be visible as a charger access-control problem and shall not silently leave the charger assumed to be in the scheduled mode.
    • Non-functional requirements:
    • NFR-001: Schedule boundary handling shall be deterministic across midnight and daylight-saving transitions.
    • NFR-002: Managed-access authorisation shall complete quickly enough for the charger integration's pre-start authorisation timeout.
    • NFR-003: Access decision recording shall be auditable and resilient to repeated or retried charger authorisation requests.
    • NFR-004: The first delivery should prefer additive API and UI changes to protect existing charger session and incident consumers.
    • NFR-005: Rollout shall be controllable by feature flag or equivalent staged rollout mechanism where customer exposure needs phasing.
    • NFR-006: Access-decision records shall avoid storing raw sensitive identifiers where a hashed or masked representation is enough for support.
    • Constraints and assumptions:
    • Chargers in scope can be switched between freevend and managed access remotely, or can be explicitly marked unsupported.
    • Chargers in scope can request authorisation before charging starts during managed access.
    • Agreement vehicle identifier management is provided by a separate process.
    • Billing and settlement remain outside this phase.
    • ADR 0009 requires timezone-aware datetime handling and UTC internal storage.
    • ADR 0020 favours additive API evolution where possible.
    • ADR 0023 supports domain-event modelling for domain-significant access decisions and downstream visibility.
    • ADR 0011 and the local feature-flag workflow shape staged rollout.
    • Build item coverage mapping:
    • Charger access mode: FR-001, FR-004, FR-005, FR-006, FR-017, NFR-004, NFR-005
    • Access schedule: FR-002, FR-003, FR-004, FR-016, NFR-001
    • Authorised vehicle identifier set: FR-007, FR-008, FR-009, FR-010, FR-014, NFR-006
    • Access decision record: FR-011, FR-012, FR-013, FR-014, NFR-002, NFR-003
    • Denial signalling contract: FR-015, FR-017
    • Verification notes:
    • Requirements should later be validated with unit and integration tests around schedule evaluation, identifier classification, access decisions, and mode-change failure handling.
    • End-to-end validation should cover at least one supported charger/protocol path for freevend switching and managed-access denial.
    • Product validation should confirm that operations users can distinguish access denied from faults and incidents.

    6. Interaction and Flow¶

    Access Schedule Configuration¶

    flowchart TD
      Start["Operator opens charger access settings"] --> Select["Select charger"]
      Select --> Capability{"Charger supports scheduled access?"}
      Capability -->|No| Unsupported["Show unsupported capability state"]
      Capability -->|Yes| Rule["Create recurring access schedule"]
      Rule --> Validate{"Schedule valid?"}
      Validate -->|No| Fix["Show overlap or timezone issue"]
      Validate -->|Yes| Save["Save access schedule"]
      Save --> Audit["Record schedule event"]
      Audit --> Evaluate["Evaluate next effective mode"]

    Managed-Access Authorisation¶

    sequenceDiagram
      participant Charger
      participant AccessControl as "Charger Access Control"
      participant Identity as "Vehicle Access Identity"
      participant Ops as "Operations Visibility"
    
      Charger->>AccessControl: Request authorisation(identifier)
      AccessControl->>Identity: Classify identifier
      Identity-->>AccessControl: Access class
      alt Own-fleet or agreement
        AccessControl-->>Charger: Allow charging
        AccessControl->>Ops: Record allowed access decision
      else Unknown or unauthorised
        AccessControl-->>Charger: Deny charging with supported signal
        AccessControl->>Ops: Record access-denied event
      end

    Access Mode State¶

    stateDiagram-v2
      [*] --> Freevend
      Freevend --> ManagedAccess: Scheduled restricted period starts
      ManagedAccess --> Freevend: Scheduled open-access period starts
      ManagedAccess --> ModeChangeProblem: Charger rejects or misses mode change
      Freevend --> ModeChangeProblem: Charger rejects or misses mode change
      ModeChangeProblem --> Freevend: Operator or integration restores freevend
      ModeChangeProblem --> ManagedAccess: Operator or integration restores managed access

    7. Non-Technical Implementation Approach¶

    • Phase 1: confirm supported charger/protocol paths.
    • Identify which chargers can support remote freevend switching and managed-access authorisation.
    • Define unsupported and partially supported capability states before exposing scheduling to operators.
    • Phase 2: define the access policy model.
    • Add the shared terms for charger access mode, access schedule, vehicle identifier, access class, and access decision.
    • Confirm how own-fleet and agreement identifier sets are supplied to the authorisation process.
    • Phase 3: deliver scheduled mode control.
    • Add recurring charger-level schedules, effective-mode evaluation, and mode-change visibility.
    • Include explicit handling for failed or delayed charger mode changes.
    • Phase 4: deliver managed-access authorisation and denial recording.
    • Evaluate charger-provided identifiers, allow known own-fleet and agreement vehicles, and deny unknown or unauthorised identifiers.
    • Record each decision separately from charger faults and incidents.
    • Phase 5: expose operations visibility and denial signalling.
    • Show access denied as a policy outcome in operations views.
    • Define charger or vehicle-facing denial behaviour by supported integration path.
    • Design considerations:
    • Keep the first scope charger-level and recurring-schedule based.
    • Treat access denial as expected policy behaviour unless a separate fault occurs.
    • Keep identifiers masked or hashed where raw values are not required.
    • Prefer additive API and UI changes so existing charging session and incident behaviour remains stable.
    • Dependencies and prerequisites:
    • Supported charger/protocol capability list.
    • Source of active own-fleet vehicle identifiers.
    • Source of active agreement vehicle identifiers.
    • Operations view decision about where access-denied events should appear.
    • Rollout decision for customer exposure and feature-flag stage.

    8. Open Questions¶

    • Which charger models and protocols are in the first supported set for reliable freevend on/off control?
    • Which charger models and protocols support pre-start managed-access authorisation within a safe timeout?
    • Which identifier types are in scope first: MAC address, RFID, PIN, or another charger-provided identifier?
    • Where is the authoritative source for own-fleet vehicle identifiers?
    • Where is the authoritative source for agreement vehicle identifiers, and how often can it change?
    • Should access-denied events appear only in operations views, or also in customer-facing reports?
    • What is the exact denial signal for each supported charger/protocol path?
    • How should the product handle a charging attempt that begins exactly at, or crosses, an access-mode boundary?
    • Are temporary manual overrides needed in the first phase, or should they be deferred?
    • What feature-flag stage and rollout language should be used for the first customer exposure?

    9. Appendices¶

    • Upstream challenge:
    • Linear initiative: Enable Scheduled Managed Charger Access
    • ADRs reviewed:
    • ADR 0009 - Use Timezone Aware DateTimes and UTC
    • ADR 0011 - Centralized feature flag repository
    • ADR 0020 - API backwards compatibility and versioning
    • ADR 0023 - Domain Event-Driven Architecture
    Made with Material for MkDocs
    BFDev Docs Assistant
    New conversation?
    Ask one focused question at a time, this helps the assistant provide accurate answers about what's been implemented in BetterFleet.