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

Videos

Abrir menú Cerrar menú
  • Colecciones
  • Temas
  • Todos los videos
  • Información

Volver a WWDC25

  • Información
  • Resumen
  • Transcripción
  • Código
  • Optimizar el consumo de electricidad en el hogar con EnergyKit

    Descubre cómo habilitar EnergyKit en tu app para que las personas puedan optimizar el consumo de electricidad en casa. Esto puede ayudar a que las personas usen electrodomésticos o carguen vehículos eléctricos cuando la electricidad es más limpia y económica. Obtén detalles sobre la incorporación, la generación de un programa de carga y la provisión de información a los usuarios sobre el uso de la energía mediante retroalimentación.

    Capítulos

    • 0:00 - Introducción
    • 2:08 - EnergyKit integrado
    • 3:28 - Generar un programa de carga
    • 7:35 - Información
    • 14:58 - Próximos pasos

    Recursos

    • Apple 2030
    • Optimizing home electricity usage
      • Video HD
      • Video SD

    Videos relacionados

    WWDC25

    • Explora la concurrencia en SwiftUI
    • Terminar tareas en segundo plano
  • Buscar este video…

    Hola, soy Dakshil y me encantaría presentarte EnergyKit. La electricidad que alimenta tu hogar proviene de diferentes fuentes a lo largo del día. Estas pueden incluir energía renovable, como la solar y la eólica, o fósil, como el carbón y el gas natural. Iniciaremos este recorrido con el lanzamiento de Grid Forecast, una función en la app Home. Permite a la gente en los EE. UU. contiguos ver los momentos del día en que hay electricidad de fuentes más limpias en la red. También hicimos que la categoría Energy de la app sea más personal y práctica al integrar el uso de electricidad del hogar directamente en la experiencia. EnergyKit impulsa estas funcionalidades y nos entusiasma poner este marco a tu disposición para apps residenciales. EnergyKit te permite integrar información sobre la red eléctrica local en tu app, ayudando a reducir o cambiar el uso de electricidad y ahorrar dinero potencialmente. Si eres un fabricante de vehículos eléctricos o de termostatos inteligentes, EnergyKit te ayuda a elegir cuándo usar electricidad, priorizando los horarios más limpios y potencialmente menos costosos. Por ejemplo, EnergyKit puede ayudar a un fabricante de vehículos eléctricos a aprovechar los horarios de carga en que la red es más limpia y menos costosa. En esta charla, te guiaremos sobre cómo integrar EnergyKit en tu app. Aprenderás cómo obtener la guía de electricidad y ajustar los horarios de carga de los vehículos eléctricos gestionados por tu app. Además, te mostraremos cómo crear una experiencia de usuario increíble con EnergyKit.

    Comencemos con cómo incorporar personas en EnergyKit.

    Para integrar EnergyKit en tu app, primero necesitas que las personas opten por una experiencia de carga de energía limpia y seleccionen cada ubicación en la que desean cargar usando electricidad más limpia. En nuestra app de ejemplo, tenemos una lista de ubicaciones donde puedes cargar un vehículo eléctrico. Agregamos un conmutador para que las personas puedan optar por una experiencia de carga de energía limpia para su vehículo eléctrico en una ubicación.

    Un EnergyVenue es un sitio físico donde los dispositivos controlados por tu app consumen electricidad de la red, y donde el propietario estableció un Hogar a través de la app Home o el flujo de incorporación de EnergyKit. Cuando se habilita la carga de energía limpia, se extrae una lista de EnergyVenues cerca de esa ubicación. Si seleccionan un lugar, debes conservar un mapeo del lugar seleccionado a la ubicación de carga hasta que cierren. Se recomienda que guardes localmente el identificador único del lugar. Para cada ejecución de tu app, debes verificar que el lugar seleccionado exista. Puedes extraer el lugar seleccionado con el identificador de lugar que guardaste antes. Ahora que identificaste que la persona desea usar la carga de energía limpia y seleccionó un EnergyVenue, el siguiente paso es generar un horario de carga de energía limpia. Para generar un horario de carga de energía limpia, necesitas una predicción que ayude a guiarlo. A esta predicción la llamamos Guía de electricidad. Esta guía se genera mediante una combinación de la ubicación de Home, información sobre esta en la red, como las emisiones de carbono o si se generan energías renovables, y de la cuenta de servicios públicos, si está disponible. Hay dos tipos de acciones de la guía disponibles: Reducir y Cambiar. Reducir se usa para dispositivos, como termostatos inteligentes, que están diseñados para reducir el consumo de electricidad. Cambiar se usa para dispositivos, como vehículos eléctricos, que pueden cambiar su consumo de electricidad de un momento a otro, pero que usan la misma cantidad de electricidad. Veamos un ejemplo. La ilustración muestra la guía de electricidad para un EnergyVenue. Los valores de la guía van de 0 a 1, como se representa en el eje Y. Los valores más bajos indican periodos en los que la electricidad es más limpia y menos costosa, si está disponible el plan de tarifas. En nuestro ejemplo, alguien registró su cuenta de servicios públicos en la app Home y tiene un plan de tarifas por horario de uso donde la electricidad es más cara entre las 4 y las 9 p. m. El auto se conecta alrededor de las 6:30 p. m. Tal vez tus preferencias de carga indiquen que el auto se desenchufó a las 9 a. m. o que la hora límite de carga es a las 9 a. m.

    Esto arroja un plazo de carga de las 6:30 p. m. a las 9 a. m. del día siguiente.

    Si no se aplica la guía al horario de carga, el auto comenzará a cargarse inmediatamente a las 6:30 p. m., lo que no es lo más favorable respecto a limpieza y costo. En su lugar, podemos seleccionar horas que optimicen el horario de carga para cargar un auto en momentos más limpios y menos costosos.

    Veamos cómo podemos obtener esta guía de electricidad en un EnergyVenue seleccionado. Primero agregamos un método llamado streamGuidance a nuestro EnergyVenueManager. Cuando hagamos actualizaciones, se guardarán en la variable de la guía.

    Necesitamos crear una consulta para obtener la guía de este ejemplo. Para un vehículo eléctrico, la acción sugerida sería cambiar el uso de electricidad. Ahora podemos extraer la guía para EnergyVenue. ElectricityGuidance tiene un asistente de servicio compartido que extrae la guía. Obtendrás un AsyncSequence, que se actualiza cuando EnergyKit recibe una nueva guía. Para conocer más, consulta el video “Desmitificar la concurrencia en SwiftUI”. Si no necesitas escuchar actualizaciones continuamente, puedes salir del bucle después de la primera búsqueda. Puedes convocar streamGuidance desde una tarea. Si tu app requiere actualizaciones en segundo plano, convócalo desde un controlador Background Task. Si tu app tiene un widget de carga interactivo, puedes usar ese widget para mantener la guía actualizada mientras la app no se ejecuta. Para más información, consulta el video “Finalizar tareas en segundo plano”.

    Ahora puedes iterar sobre los valores de la guía para determinar los mejores momentos para cargar. EnergyKit Insights ayuda a proporcionar información sobre electricidad en un formato sencillo. Puedes usar esta información para que las personas sepan qué proporción de la electricidad con la que cargan su vehículo se produjo en momentos más limpios, lo que ayuda a reducir las emisiones de carbono que emiten. El consumo de electricidad del vehículo se clasifica según la limpieza de la red y se informa en una de tres categorías: limpiar, reducir y evitar. También puedes informarles sobre la electricidad usada durante las horas menos costosas. Este consumo se clasifica según el plan de tarifas cuando está disponible y se informa en una de cinco categorías: superreducido, reducido, medio, alto y superalto.

    El plan de tarifas es un plan de precios. La siguiente pregunta es: ¿cómo funciona esta información? La información se basa en varios factores. El algoritmo que usas para cambiar o reducir la electricidad según la guía proporcionada determina si el dispositivo controlado consume electricidad en horarios más limpios o menos costosos. El estado de la red eléctrica donde tu dispositivo consume electricidad está determinado por varios factores, como la demanda, los generadores renovables en línea, las emisiones de red, etc. Si la persona registró su cuenta de servicios públicos en la app Home y tiene un plan de tarifas por tiempo de uso, el consumo de electricidad se puede atribuir a los diversos periodos para recuperar el costo del uso de electricidad. Y lo más importante, cómo y cuándo tu dispositivo consumió electricidad. Esto se determina por el comportamiento de tu dispositivo, la interacción de las personas y cómo tu app aplicó la guía al dispositivo. Para un fabricante de vehículos eléctricos, este sería el comportamiento de la sesión de carga. Es necesario que tu app envíe información a EnergyKit con el fin de generar un entendimiento de la carga de tu auto con respecto a la limpieza y el costo aproximado de electricidad que usa. Esta información se llama LoadEvents. Debes crear eventos regularmente a medida que tu auto se carga y hay cambios en su estado de carga durante la sesión. Cuando comience una sesión, crea un evento que represente el estado del vehículo en ese momento. A medida que el auto se cargue, crea eventos regularmente. Recomendamos un evento cada 15 minutos cuando el auto cargue a un ritmo constante. Crea eventos para sucesos significativos, como una pausa en la sesión, un cambio en el horario de carga debido a un nuevo conjunto de guías o un cambio rápido en el consumo de energía. Al final de una sesión, ciérrala con un evento que represente el estado final del vehículo. Para que EnergyKit genere información sobre los eventos creados, debes enviarlos a EnergyKit. Puedes enviar eventos a medida que ocurren o en lotes periódicos, e incluso en un lote al final de la sesión de carga. Recomendamos enviarlos por lotes para mejorar el rendimiento. No envíes eventos entre sesiones de carga. Veamos cómo crear y enviar estos eventos. Para una sesión de carga, los datos más importantes son: el estado de carga de la batería, la energía consumida en un momento dado, la energía acumulada consumida desde el inicio de una sesión de carga. El inicio de la sesión ocurre cuando el auto comienza a cargarse.

    Este evento representa el estado inicial del vehículo al inicio de la sesión de carga. El estado de la guía indica si la sesión se inició porque el horario de carga seguía la guía de electricidad representada por el token de guía. Este token es exclusivo del teléfono que extrajo la guía que estaba vigente y debe usarse para crear eventos en ese teléfono. Mientras avanza la carga, la sesión se marca como activa. Una vez finalizada la sesión de carga, la sesión se cierra con un evento final. Este evento representa el estado final del vehículo al terminar la sesión de carga. En nuestra app de ejemplo, creamos LoadEvents y los almacenamos en caché para su envío como un lote. Estos grupos de eventos se envían al EnergyVenue en el que se estaba cargando el vehículo. Se almacenan según las políticas de privacidad de Apple con almacenamiento en Core Data y se respaldan con cifrado de extremo a extremo en CloudKit. También se comparten con todas las personas que ya comparten el hogar de HomeKit asociado al EnergyVenue donde se envían los eventos. Por fin tenemos la información necesaria para generar un entendimiento. Primero creamos una consulta donde especificamos que estamos interesados en obtener datos sobre la limpieza y el costo relativo, si está disponible. En nuestra app de ejemplo, nos interesa mostrar un resumen del consumo de electricidad de un día anterior. Ya que creamos la consulta, obtenemos información del auto en un lugar donde se estuvo cargando anteriormente. Recibimos un AsyncStream y, dado que estamos interesados en la información de un día en particular, filtramos según nuestros requisitos. El entendimiento obtenido se puede usar para crear un resumen. Tu app ahora está integrada en EnergyKit. Aquí repasamos los componentes básicos de la interacción con EnergyKit. Para la incorporación, analizamos cómo interactuarían las personas con tu app para seleccionar un EnergyVenue. Luego vimos cómo usar el EnergyVenue seleccionado, obtener una guía de electricidad y usarla para generar un horario de carga.

    Después de generar un horario de carga, cuando tu auto se carga, repasamos la importancia de enviar LoadEvents a EnergyKit para impulsar la obtención de información. Por último, vimos cómo puedes solicitar información basada en la guía y la que envió tu app para mejorar la experiencia de usuario. Puedes descargar la app de ejemplo que usamos aquí y acceder a la documentación de EnergyKit en developer.apple.com. En Apple, estamos comprometidos con la protección del medio ambiente y puedes conocer más al respecto en apple.com/2030. Nos emociona ver qué apps increíbles crearás usando 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 - Introducción
    • La estructura EnergyKit te permite integrar información de la red eléctrica local en tus apps para que las personas puedan reducir el uso, ahorrar dinero y priorizar fuentes de energía más limpias al usar dispositivos como termostatos inteligentes o cargar vehículos eléctricos.

    • 2:08 - EnergyKit integrado
    • Para incorporarse a EnergyKit, los usuarios optan por la carga de energía limpia para una ubicación específica. Tu app recupera la ubicación (conocida como energy venue) y almacena su identificador.

    • 3:28 - Generar un programa de carga
    • EnergyKit proporciona orientación sobre la electricidad según la ubicación, la información de la red y los datos de la compañía eléctrica para crear un programa de carga de energía limpia. Puede sugerir acciones de "reducir" (para dispositivos como termostatos inteligentes) o acciones de "cambiar" (para usos como la carga de vehículos eléctricos). Las guías sobre electricidad priorizan horarios de menor demanda y más económicos para optimizar los costos y el impacto medioambiental.

    • 7:35 - Información
    • Los conocimientos de EnergyKit ayudan a simplificar la presentación de información sobre electricidad para los usuarios y pueden categorizar el uso de electricidad en función de la limpieza de la red. Para que los fabricantes de vehículos eléctricos generen entendimiento, las apps envían información a EnergyKit en forma de eventos de carga que rastrean el progreso durante la sesión de carga. Al agrupar y enviar estos eventos, EnergyKit puede analizar con precisión los datos de carga.

    • 14:58 - Próximos pasos
    • Adopta EnergyKit en tus apps que gestionan el uso de electricidad. Para obtener más detalles, consulta el código de muestra que acompaña a esta sesión.

Developer Footer

  • Videos
  • WWDC25
  • Optimizar el consumo de electricidad en el hogar con 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