View in English

  • Global Nav Open Menu Global Nav Close Menu
  • Apple Developer
Search
Cancel
  • Apple Developer
  • News
  • Discover
  • Design
  • Develop
  • Distribute
  • Support
  • Account
Only search within “”

Quick Links

5 Quick Links

Vidéos

Ouvrir le menu Fermer le menu
  • Collections
  • Sujets
  • Toutes les vidéos
  • À propos

Retour à WWDC25

  • À propos
  • Résumé
  • Transcription
  • Code
  • Optimisez votre consommation d’électricité domestique avec EnergyKit

    Découvrez comment intégrer EnergyKit dans votre app afin d'aider les utilisateurs à optimiser leur consommation d'électricité à domicile. Cela leur permettra d'utiliser leurs appareils électroménagers ou de recharger leurs véhicules électriques pendant les périodes où l'électricité est plus propre et moins chère. Obtenez des détails sur l'intégration, la génération d'un planning de recharge et la transmission d'informations sur la consommation d'énergie aux utilisateurs grâce aux retours sur leur consommation d'électricité.

    Chapitres

    • 0:00 - Introduction
    • 2:08 - EnergyKit embarqué
    • 3:28 - Générer un planning de recharge
    • 7:35 - Informations
    • 14:58 - Étapes suivantes

    Ressources

    • Apple 2030
    • Optimizing home electricity usage
      • Vidéo HD
      • Vidéo SD

    Vidéos connexes

    WWDC25

    • Découvrir la simultanéité dans SwiftUI
    • Terminez les tâches d’arrière-plan
  • Rechercher dans cette vidéo…

    Bonjour, je suis Dakshil, je suis ravi de vous présenter EnergyKit. L’électricité qui alimente votre domicile provient de différentes sources au fil de la journée. Cela peut inclure du solaire, de l’éolien ou des énergies fossiles comme le charbon et le gaz naturel. Nous avons lancé cette initiative avec Grid Forecast, une fonctionnalité intégrée à l’app Maison. Elle indique aux utilisateurs aux États-Unis les moments où le réseau fournit une électricité plus propre. Nous avons rendu la section Énergie de l’app Maison plus personnalisée et utile en y intégrant la consommation électrique du domicile. EnergyKit alimente ces fonctionnalités, et nous sommes ravis de le proposer pour les apps résidentielles. EnergyKit vous permet d’intégrer des insights sur le réseau local dans votre app pour aider les utilisateurs à réduire ou décaler leur consommation et faire des économies. Par exemple, si vous fabriquez des véhicules électriques ou des thermostats connectés, EnergyKit peut vous aider à choisir les moments où consommer, en privilégiant une électricité plus propre et moins coûteuse. EnergyKit peut aider un fabricant de véhicules électriques à décaler la recharge à des moments où le réseau est plus propre et moins coûteux. Dans cette présentation, je vais vous montrer comment intégrer EnergyKit à votre app. Vous apprendrez à récupérer des données sur l’électricité et à ajuster les horaires de recharge des véhicules électriques via votre app. Je vais aussi vous montrer comment offrir une excellente expérience utilisateur grâce aux insights d’EnergyKit.

    Commençons par intégrer les utilisateurs à EnergyKit.

    Pour intégrer EnergyKit dans votre app, les utilisateurs doivent d’abord activer l’expérience de recharge propre et choisir les lieux où ils veulent en profiter. Dans notre app d’exemple, une liste de lieux représente les endroits où vous rechargez un véhicule électrique. Nous avons ajouté un bouton pour activer la recharge propre à cet endroit pour leur véhicule électrique.

    Un EnergyVenue est un lieu physique où les appareils de votre app consomment de l’électricité, et où un domicile a été configuré via l’app Maison ou le processus d’intégration d’EnergyKit. Lorsqu’ils activent la recharge propre, la liste des EnergyVenues proches de ce lieu s’affiche. S’ils choisissent un lieu, vous devez l’associer à l’emplacement de recharge jusqu’à ce qu’ils se désinscrivent. Il est recommandé de stocker localement l’identifiant unique du lieu. À chaque lancement de l’app, vérifiez que le lieu sélectionné existe toujours. Vous pouvez récupérer le lieu sélectionné grâce à l’identifiant enregistré précédemment. Maintenant que l’utilisateur a activé la recharge propre et sélectionné un EnergyVenue, l’étape suivante consiste à générer un planning de recharge optimisé. Pour générer un planning de recharge optimisé, vous avez besoin d’une prévision qui servira de base au calcul. Cette prévision est appelée « conseil énergétique ». Ce conseil est généré à partir de l’emplacement du domicile, des données du réseau, comme les émissions de carbone ou la production d’énergies renouvelables et, si possible, des infos du compte fournisseur. Deux types d’actions sont disponibles : Réduire et Décaler. L’action « Réduire » s’applique aux appareils, comme les thermostats connectés, conçus pour limiter la consommation électrique. L’action « Décaler » concerne les appareils, comme les véhicules électriques, qui peuvent décaler leur consommation tout en conservant la même quantité d’électricité utilisée. Examinons ensemble un exemple. L’illustration montre le conseil énergétique associé à un EnergyVenue. Les valeurs vont de 0 à 1 sur l’axe Y : plus elles sont basses, plus l’électricité est propre et potentiellement moins chère si les tarifs sont disponibles. Dans notre exemple, l’utilisateur a lié son compte fournisseur dans l’app Maison et suit un tarif horaire où l’électricité est plus chère entre 16h et 21h. La voiture est branchée vers 18h30. Les préférences de recharge peuvent indiquer que la voiture est débranchée ou doit être chargée avant 9h.

    Cela nous donne une plage de recharge de 18h30 à 9h le lendemain.

    Sans conseil appliqué, la voiture peut commencer à se charger dès 18h30, ce qui n’est ni le plus propre, ni le plus économique. À la place, on peut choisir des heures qui optimisent la recharge pendant des périodes plus propres et potentiellement moins chères.

    Voyons comment récupérer le conseil énergétique pour un EnergyVenue sélectionné. On commence par ajouter une méthode appelée streamGuidance à notre EnergyVenueManager. À chaque mise à jour, on stocke les données dans la variable guidance.

    Il faut créer une requête pour récupérer les conseils adaptés à notre cas d’utilisation. Pour un véhicule électrique, l’action recommandée est de décaler la consommation d’électricité. Nous sommes maintenant prêts à récupérer les conseils pour l’EnergyVenue. ElectricityGuidance dispose d’une aide sharedService à utiliser pour récupérer le conseil. Vous recevez un AsyncSequence mis à jour au fur et à mesure qu’EnergyKit reçoit de nouveaux conseils. Pour en savoir plus, regardez la vidéo « Demystify concurrency in SwiftUI ». Si vous ne suivez pas les mises à jour en continu, vous pouvez sortir de la boucle après la 1ère récupération des données. Vous pouvez appeler streamGuidance à partir d’une tâche. Si votre app doit recevoir des mises à jour en arrière-plan, appelez cette méthode depuis un gestionnaire de tâche en arrière-plan. Si votre app a un widget de recharge interactif, vous pouvez l’utiliser pour garder les conseils à jour même quand l’app ne tourne pas. Pour en savoir plus, regardez la vidéo « Finish tasks in the background ».

    Vous pouvez maintenant parcourir les valeurs pour identifier les meilleurs moments pour recharger. Les insights d’EnergyKit fournissent des infos sur l’électricité dans un format facile à présenter aux utilisateurs. Ces insights permettent d’indiquer quelle part de la recharge a été effectuée pendant des périodes plus propres, contribuant ainsi à réduire les émissions liées à la consommation électrique du domicile. La consommation électrique du véhicule est classée selon la propreté du réseau, dans l’une de ces trois catégories : propre, à réduire ou à éviter. Vous pouvez aussi leur indiquer la part de l’électricité utilisée les périodes les moins chères. La consommation du véhicule est aussi classée selon le tarif d’électricité, quand il est disponible, en cinq catégories : super creux, creux, semi-creux, plein, et pointe critique.

    Le tarif d’électricité est aussi appelé « tarif horaire ». La question suivante est : comment fonctionnent ces insights ? Ils sont influencés par plusieurs facteurs combinés. L’algorithme que vous utilisez pour décaler ou réduire la consommation selon les conseils détermine si l’appareil consomme pendant des périodes plus propres ou moins chères. L’état du réseau électrique au moment de la consommation dépend de plusieurs facteurs, comme la demande, la production renouvelable en service, pendant les émissions, etc. Si l’utilisateur a lié son compte fournisseur dans l’app Maison et suit un tarif horaire, la consommation peut être répartie selon les périodes pour estimer le coût relatif de l’électricité. Et surtout, quand et comment votre appareil a consommé de l’électricité. Cela dépend du comportement de l’appareil, des interactions des utilisateurs, et de la façon dont votre app a appliqué les conseils. Pour un fabricant de véhicules électriques, cela correspond au comportement de recharge du véhicule. Pour générer des insights sur la recharge en fonction de la propreté et du coût relatif de l’électricité, votre app doit envoyer des retours à EnergyKit. Ces retours sont appelés « LoadEvents ». Vous devez créer régulièrement des événements pendant la recharge, à chaque changement d’état de charge du véhicule. Au début d’une session de recharge, créez un événement représentant l’état du véhicule. Pendant la recharge, créez des événements régulièrement. Nous recommandons un événement toutes les 15 minutes lorsque la recharge est stable. En cas d’événement important (pause, changement de planning ou variation rapide de la consommation), créez un événement correspondant. À la fin d’une session, terminez-la par un événement qui reflète l’état final du véhicule. Pour qu’EnergyKit génère des insights, vous devez lui envoyer les événements créés. Vous pouvez envoyer les événements au fur et à mesure, par lots périodiques, ou tous à la fin de la session. Nous recommandons d’envoyer les événements par lots pour des raisons de performances. N’envoyez pas d’événements entre les sessions de recharge. Voyons comment créer et soumettre ces événements. Lors d’une session de recharge, les informations clés sont : l’état de charge de la batterie, l’énergie consommée à un moment donné, l’énergie cumulée consommée depuis le début d’une session de recharge. Le début de la session correspond au moment où le véhicule commence à se charger.

    Cet événement représente l’état initial du véhicule au début de la session de recharge. L’état des conseils indique si la session a démarré parce que le planning de recharge suivait les recommandations identifiées par le jeton de conseil. Ce jeton est unique au téléphone qui a récupéré les conseils en vigueur, et doit être utilisé pour créer les événements sur ce même téléphone. Pendant la recharge, la session est considérée comme active. Une fois la session terminée, elle est clôturée par un événement de fin. Cet événement représente l’état final du véhicule à la fin de la session de recharge. Dans notre app d’exemple, nous créons des LoadEvents que nous mettons en cache avant de les envoyer par lots. Ces événements regroupés sont envoyés à l’EnergyVenue où le véhicule était en charge. Les événements soumis sont stockés selon les règles de confidentialité Apple, dans Core Data sur l’appareil, avec une sauvegarde chiffrée de bout en bout sur CloudKit. Ces données sont aussi partagées avec toutes les personnes qui partagent déjà le domicile HomeKit lié à l’EnergyVenue concerné. Nous disposons désormais de toutes les infos pour générer des insights. Pour récupérer les insights, on crée d’abord une requête précisant qu’on souhaite des données sur la propreté et le coût relatif, si disponibles. Dans notre app d’exemple, nous voulons afficher un résumé de la consommation électrique de la veille. Une fois la requête créée, nous pouvons récupérer les insights pour notre véhicule là où il a chargé précédemment. Nous recevons un AsyncStream et, comme nous cherchons les données pour un jour précis, nous pouvons filtrer le flux selon nos besoins. L’insight récupéré peut maintenant servir à créer un résumé. Votre app est désormais intégrée à EnergyKit. Dans cette présentation, nous avons passé en revue les bases pour interagir avec EnergyKit. Pour l’intégration, nous avons vu comment les utilisateurs choisissent un EnergyVenue dans votre app. Nous avons ensuite expliqué comment utiliser l’EnergyVenue sélectionné pour récupérer les conseils énergétiques et générer un planning de recharge.

    Après avoir généré un planning de recharge, nous avons souligné l’importance d’envoyer des LoadEvents à EnergyKit pendant la recharge pour alimenter la création d’insights. Enfin, nous avons vu comment demander des insights à partir des conseils récupérés et des retours envoyés par votre app pour enrichir l’expérience utilisateur. Vous pouvez télécharger l’app d’exemple accompagnant cette présentation et accéder à la documentation d’EnergyKit sur developer.apple.com. Chez Apple, nous nous engageons à protéger l’environnement. Pour en savoir plus, rendez-vous sur apple.com/2030. Nous avons hâte de découvrir les apps incroyables que vous allez créer avec EnergyKit.

    • 3:13 - Retrive an EnergyVenue

      // Retrieve an EnergyVenue
      
      import EnergyKit
      import Foundation
      
      @Observable final class EnergyVenueManager  {
      
          let venue: EnergyVenue
      
          init?(venueID: UUID) async {
              guard let energyVenue = await EnergyVenue.venue(for: venueID) else {
                  return nil
              }
              venue = energyVenue
          }
      }
    • 6:03 - Fetch Electricity Guidance at a selected EnergyVenue

      // Fetch ElectricityGuidance
      
      import EnergyKit
      import Foundation
      
      @Observable final class EnergyVenueManager  {
          // The current active guidance.
          var guidance: ElectricityGuidance?
      
          fileprivate func streamGuidance(
              venueID: UUID,
              update: (_ guidance: ElectricityGuidance) -> Void
          ) async throws {
              let query = ElectricityGuidance.Query(suggestedAction: .shift)
              for try await currentGuidance in ElectricityGuidance.sharedService.guidance(
                  using: query,
                  at: venueID
              ) {
                  update(currentGuidance)
                	break
              }
          }
      }
    • 7:00 - Start monitoring Electricity Guidance

      // Fetch ElectricityGuidance
      
      import EnergyKit
      import Foundation
      
      @Observable final class EnergyVenueManager  {
          // The task used to stream guidance.
          private var streamGuidanceTask: Task<(), Error>?
      
          ///Start streaming guidance and store the value in the observed property 'guidance'.
          func startGuidanceMonitoring() {
             streamGuidanceTask?.cancel()
              streamGuidanceTask = Task.detached { [weak self] in
                  if let venueID = self?.venue.id {
                      try? await self?.streamGuidance(venueID: venueID) { guidance in
                          self?.guidance = guidance
                          if Task.isCancelled {
                              return
                          }
                      }
                  }
              }
          }
      }
    • 11:30 - Update charging measurements

      // Update charging measurements
      
      import EnergyKit
      
      // A controller that handles an electric vehicle
      @Observable class ElectricVehicleController {
          fileprivate func chargingMeasurement() -> ElectricVehicleLoadEvent.ElectricalMeasurement {
              let stateOfCharge = Int(configuration.state.stateOfCharge.rounded(.down))
              let power = Measurement<UnitPower>(
                  value: configuration.properties.chargingPower * 1000000,
                  unit: .milliwatts
              )
              let energy = Measurement<UnitEnergy>(
                  value: configuration.state.cummulativeEnergy * 1000000,
                  unit: .EnergyKit.milliwattHours
              )
              return ElectricVehicleLoadEvent.ElectricalMeasurement(
                  stateOfCharge: stateOfCharge,
                  direction: .imported,
                  power: power,
                  energy: energy
              )
          }
      }
    • 11:50 - Start a session

      // Start a session
      
      import EnergyKit
      
      // A controller that handles an electric vehicle
      @Observable class ElectricVehicleController {
          // The session
          var session: ElectricVehicleLoadEvent.Session?
      
          // The current guidance stored at the EV
          var currentGuidance: ElectricityGuidance
      
          // Whether the EV is following guidance
          var isFollowingGuidance: Bool = true
      
          fileprivate func beginSession() {
              session = ElectricVehicleLoadEvent.Session(
                  id: UUID(),
                  state: .begin,
                  guidanceState: .init(
                      wasFollowingGuidance: isFollowingGuidance,
                      guidanceToken: currentGuidance.guidanceToken
                  )
              )
          }
      }
    • 12:25 - Update a session

      // Update a session
      
      import EnergyKit
      
      // A controller that handles an electric vehicle
      @Observable class ElectricVehicleController {
          fileprivate func updateSession() {
              if let session {
                  self.session = ElectricVehicleLoadEvent.Session(
                      id: session.id,
                      state: .active,
                      guidanceState: .init(
                          wasFollowingGuidance:
                          isFollowingGuidance,
                          guidanceToken:
                          currentGuidance.guidanceToken
                      )
                  )
              }
          }
      }
    • 12:31 - End a session

      // End a session
      
      import EnergyKit
      
      // A controller that handles an electric vehicle.
      @Observable class ElectricVehicleController {
          fileprivate func endSession() {
              if let session {
                  self.session = ElectricVehicleLoadEvent.Session(
                      id: session.id,
                      state: .end,
                      guidanceState: .init(
                          wasFollowingGuidance:
                          isFollowingGuidance,
                          guidanceToken:
                          currentGuidance.guidanceToken
                      )
                  )
              }
          }
      }
    • 12:43 - Create a load event

      // Create a ElectricVehicleLoadEvent
      
      @Observable class ElectricVehicleController {
          fileprivate func createLoadEvent(
              sessionState: ElectricVehicleLoadEvent.Session.State
          ) {
              switch sessionState {
              case .begin:
                  beginSession()
              case .active:
                  updateSession()
              case .end:
                  endSession()
              @unknown default:
                  fatalError()
              }
              if let session {
                  let event = ElectricVehicleLoadEvent(
                      timestamp: configuration.state.timestamp,
                      measurement: chargingMeasurement(),
                      session: session,
                      deviceID: configuration.properties.vehicleID
                  )
                 events.append(event)
              }
          }
      }
    • 12:50 - Submit events

      // Submit events
      
      import EnergyKit
      
      // A controller that handles an electric vehicle
      @Observable class ElectricVehicleController {
          // EnergyVenue
          // The venue at which the EV uses energy
          var currentVenue: EnergyVenue
      
          // Electric EV Events
          // The list of generated EV load events
          var events = [ElectricVehicleLoadEvent]()
          
          func submitEvents() async throws {
              try await currentVenue.submitEvents(events)
          }
      }
    • 13:25 - Create an insight query

      // Create an insight query
      
      import EnergyKit
      
      @Observable final class EnergyVenueManager  {
          func createInsightsQuery(on date: Date) -> ElectricityInsightQuery {
              return ElectricityInsightQuery(
                  options: .cleanliness.union(.tariff),
                  range: self.dayInterval(date: date),
                  granularity: .daily,
                  flowDirection: .imported
              )
          }
      }
    • 13:43 - Request insights

      // Request an insights
      
      import EnergyKit
      
      @Observable final class EnergyVenueManager  {
          func generateInsights(for vehicleIdentifier: String, on date: Date) async throws ->
    ElectricityInsightRecord<Measurement<UnitEnergy>>? {
              let query = createInsightsQuery(on: date)
              return try await ElectricityInsightService.shared.energyInsights(
                  forDeviceID: vehicleIdentifier,
                  using: query,
                  atVenue: self.venue.id
              ).first { record in
                  return record.range.start == query.range.start
              }
          }
      }
    • 0:00 - Introduction
    • Le framework EnergyKit vous permet d'intégrer les données du réseau électrique local dans vos apps, afin que les utilisateurs réduisent leur consommation, économisent de l'argent et privilégient les sources d'énergie propres lorsqu'ils utilisent des dispositifs comme des thermostats connectés ou des véhicules électriques.

    • 2:08 - EnergyKit embarqué
    • Pour activer EnergyKit, les utilisateurs acceptent le chargement propre de l'énergie pour un emplacement spécifique. Votre app récupère cet emplacement (appelé energy venue) et en stocke l'identifiant.

    • 3:28 - Générer un planning de recharge
    • EnergyKit fournit des recommandations de consommation d'électricité, fondées sur la localisation, l'état du réseau et les données du fournisseur, pour créer un planning de recharge propre. Il peut suggérer des actions de « réduction » (pour des dispositifs comme les thermostats) ou de « décalage » (pour des usages comme la recharge de véhicules électriques). Ces recommandations privilégient les heures creuses les plus propres et les moins chères, optimisant les coûts et l'impact environnemental.

    • 7:35 - Informations
    • Les informations d'EnergyKit facilitent la visualisation de la consommation électrique et permettent de catégoriser l'utilisation en fonction de la propreté du réseau. Pour les fabricants de véhicules électriques, les apps peuvent transmettre à EnergyKit des événements de charge pour suivre les sessions de recharge. En regroupant et en envoyant ces événements, EnergyKit peut analyser les données de charge de manière précise.

    • 14:58 - Étapes suivantes
    • Intégrez EnergyKit dans vos apps qui gèrent la consommation d'électricité. Pour plus de détails, consultez le code exemple associé à cette séance.

Developer Footer

  • Vidéos
  • WWDC25
  • Optimisez votre consommation d’électricité domestique avec EnergyKit
  • Open Menu Close Menu
    • iOS
    • iPadOS
    • macOS
    • tvOS
    • visionOS
    • watchOS
    Open Menu Close Menu
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • Icon Composer
    • SF Symbols
    Open Menu Close Menu
    • Accessibility
    • Accessories
    • App Store
    • Audio & Video
    • Augmented Reality
    • Business
    • Design
    • Distribution
    • Education
    • Fonts
    • Games
    • Health & Fitness
    • In-App Purchase
    • Localization
    • Maps & Location
    • Machine Learning & AI
    • Open Source
    • Security
    • Safari & Web
    Open Menu Close Menu
    • Documentation
    • Sample Code
    • Tutorials
    • Downloads
    • Forums
    • Videos
    Open Menu Close Menu
    • Support Articles
    • Contact Us
    • Bug Reporting
    • System Status
    Open Menu Close Menu
    • Apple Developer
    • App Store Connect
    • Certificates, IDs, & Profiles
    • Feedback Assistant
    Open Menu Close Menu
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program
    • News Partner Program
    • Video Partner Program
    • Security Bounty Program
    • Security Research Device Program
    Open Menu Close Menu
    • Meet with Apple
    • Apple Developer Centers
    • App Store Awards
    • Apple Design Awards
    • Apple Developer Academies
    • WWDC
    Get the Apple Developer app.
    Copyright © 2025 Apple Inc. All rights reserved.
    Terms of Use Privacy Policy Agreements and Guidelines