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

Vídeos

Abrir menu Fechar menu
  • Coleções
  • Tópicos
  • Todos os vídeos
  • Sobre

Mais vídeos

  • Sobre
  • Resumo
  • Transcrição
  • Código
  • Torne o consumo de energia da sua casa mais eficiente com o EnergyKit

    Saiba como incluir o EnergyKit em seu app para que as pessoas possam otimizar o consumo de energia em casa. Isso pode ajudar as pessoas a usar eletrodomésticos ou carregar veículos elétricos durante os períodos em que a eletricidade é mais limpa e barata. Obtenha informações sobre o processo de integração, a criação de um cronograma de carregamento e o fornecimento de insights sobre o consumo de energia para os usuários por meio de feedback baseado no uso da eletricidade.

    Capítulos

    • 0:00 - Introdução
    • 2:08 - Integrar o EnergyKit
    • 3:28 - Gerar um cronograma de carregamento
    • 7:35 - Insights
    • 14:58 - Próximas etapas

    Recursos

    • Apple 2030
    • Optimizing home electricity usage
      • Vídeo HD
      • Vídeo SD

    Vídeos relacionados

    WWDC25

    • Conclua tarefas em segundo plano
    • Explore a concorrência no SwiftUI
  • Buscar neste vídeo...

    Olá, meu nome é Dakshil, e tenho o prazer de apresentar o EnergyKit. A eletricidade de nossas casas vem de diferentes fontes ao longo do dia. Elas incluem energia renovável, como a solar e a eólica, ou combustíveis fósseis, como o carvão e o gás natural. Começamos essa jornada lançando a Previsão da Rede Elétrica, um recurso no app Casa. Ele permite que as pessoas nos EUA vejam os horários do dia em que a eletricidade de fontes relativamente mais limpas está disponível na rede. Também deixamos a categoria Energia do app Casa mais pessoal e prática, integrando o uso doméstico da eletricidade diretamente à experiência. O EnergyKit está por trás desses recursos, e estamos animados em disponibilizar esse framework para aplicações residenciais. O EnergyKit permite que você integre informações sobre a rede elétrica local das pessoas em seu app, ajudando-as a reduzir ou mudar o consumo de eletricidade e economizar dinheiro. Por exemplo, se você for um fabricante de veículos elétricos ou de termostatos inteligentes, o EnergyKit poderá te ajudar a escolher quando usar a eletricidade, priorizando horários mais limpos e mais baratos. Por exemplo, o EnergyKit pode ajudar fabricantes de veículos elétricos a mudar os horários de carregamento para horários em que a rede é mais limpa e mais barata. Nesta sessão, vamos ensinar você a integrar o EnergyKit ao seu app. Você vai aprender a obter orientação sobre eletricidade e a ajustar os horários de carregamento de veículos elétricos gerenciados pelo seu app. Também vamos mostrar como criar uma experiência incrível para os usuários com as informações do EnergyKit.

    Vamos começar explicando como integrar pessoas ao EnergyKit.

    Para integrar o EnergyKit ao seu app, primeiro é necessário que as pessoas optem pela experiência de Carregamento com Energia Limpa e selecionem cada local onde desejam carregar usando eletricidade mais limpa. No nosso app de exemplo, temos uma lista dos locais onde você carrega um veículo elétrico. Adicionamos uma opção para que as pessoas aceitem a experiência de Carregamento com Energia Limpa para seu veículo elétrico ao carregar nesse local.

    Um EnergyVenue é um ponto físico onde os dispositivos controlados pelo seu app consomem eletricidade da rede e onde o proprietário estabeleceu uma residência no app Casa ou no fluxo de integração do EnergyKit. Quando as pessoas ativam o Carregamento com Energia Limpa, obtemos uma lista de EnergyVenues próximos a esse local. Quando uma pessoa seleciona um ponto, você deve manter um mapeamento desse ponto para o local de carregamento até ela desativar a opção. Recomenda-se que você armazene localmente o identificador exclusivo do ponto. Em cada inicialização do app, você deve verificar se o ponto selecionado existe. Para obter o ponto selecionado, use o identificador que salvou anteriormente. Agora que já você identificou que a pessoa deseja usar o Carregamento com Energia Limpa e escolheu um EnergyVenue, a próxima etapa é gerar um horário para o Carregamento com Energia Limpa. Para gerar um horário para o Carregamento com Energia Limpa, é necessária uma previsão que vai ajudar a orientar o horário. Chamamos essa previsão de orientação de eletricidade. Ela é gerada por uma combinação do local no app Casa, informações da rede sobre o local, como emissões de carbono ou fontes de energia renovável, e informações das contas de serviços públicos, se disponíveis. Há dois tipos de ações de orientação disponíveis: Reduzir e Mudar. A ação de orientação Reduzir é usada para dispositivos como termostatos inteligentes, cuja intenção é reduzir o consumo de eletricidade. A ação de orientação Mudar é usada para dispositivos como veículos elétricos, a fim de mudar o horário de consumo de eletricidade mantendo a quantidade. Vamos conferir um exemplo. Este gráfico mostra a orientação de eletricidade para um EnergyVenue. Os valores de orientação vão de 0 a 1, conforme mostrado no eixo Y, em que os valores mais baixos são períodos em que a eletricidade é mais limpa e mais barata, caso as informações do plano de tarifas estejam disponíveis. Neste exemplo, uma pessoa integrou sua conta de serviço público ao app Casa e está em um plano de tarifa de tempo de consumo em que a eletricidade é mais cara das 16h às 21h. O carro é conectado por volta das 18h30. As preferências de carregamento indicam que o carro foi desconectado por volta das 9h, ou que o prazo de carregamento é 9h.

    Com isso, nossa janela de carregamento é das 18h30 às 9h do dia seguinte.

    Se a orientação não for aplicada ao horário de carregamento, o carro vai começar a carregar às 18h30, o que não é o ideal do ponto de vista de limpeza e custo. Em vez disso, podemos escolher horários de modo a otimizar o carregamento do veículo em horários mais limpos e também mais baratos.

    Vamos ver como podemos obter essa orientação de eletricidade no EnergyVenue escolhido. Começamos adicionando um método chamado streamGuidance à classe EnergyVenueManager. As atualizações recebidas serão armazenadas na variável guidance.

    No nosso caso, precisamos criar uma consulta para recuperar a orientação. Para um veículo elétrico, o tipo de ação sugerido é mudar o consumo de eletricidade. Já podemos obter a orientação para o EnergyVenue. ElectricityGuidance tem um sharedService auxiliar que deve ser usado para obter a orientação. Você recebe um AsyncSequence, que é atualizado à medida que o EnergyKit recebe orientações atualizadas. Saiba mais no vídeo “Desmistificar a simultaneidade na SwiftUI”. Se você não precisar receber atualizações continuamente, poderá sair do loop após a primeira busca. Você pode chamar streamGuidance de um Task. Se o seu app precisar de atualizações em segundo plano, você deverá chamá-lo de um gerenciador de tarefas de fundo. Se o app tiver um widget de carregamento interativo, você também poderá usar esse widget para manter a orientação atualizada enquanto o app não estiver em execução. Para saber mais, assista ao vídeo “Concluir tarefas em segundo plano”.

    Agora você pode iterar os valores de orientação a fim de determinar os melhores horários para carregar. Os insights do EnergyKit ajudam a apresentar informações sobre eletricidade em um formato simples para as pessoas. Você pode usar as informações fornecidas para mostrar às pessoas quanto da eletricidade consumida para carregar o veículo foi usada em horários mais limpos, ajudando a reduzir as emissões de carbono do consumo doméstico de eletricidade. O consumo de eletricidade do veículo é categorizado com base na limpeza da rede e é dividido nas seguintes categorias: Limpa, Reduzir e Evitar. Você também pode informar sobre a eletricidade consumida em períodos mais baratos. O consumo de eletricidade do veículo é categorizado com base no plano de tarifas de eletricidade, quando disponível, e é dividido nas seguintes categorias: muito fora de pico, fora de pico, intermediário, pico e pico crítico.

    O plano de tarefas também é conhecido como tarifário. A próxima pergunta é: Como funcionam esses insights? Eles são influenciados por vários fatores. O algoritmo que você usa para mudar ou reduzir o consumo de eletricidade com base na orientação fornecida determina se o dispositivo controlado consome eletricidade em horários mais limpos ou mais baratos. O estado da rede elétrica em que seu dispositivo consumiu eletricidade é determinado por vários fatores, como demanda elétrica, presença de geradores renováveis na rede, emissões da rede etc. Se a pessoa tiver integrado a conta de serviço público no app Casa e estiver em um plano de tarifa de tempo de consumo, o uso de eletricidade poderá ser atribuído aos vários períodos de uso para chegar ao custo relativo do consumo de eletricidade. E a parte mais importante, como e quando o dispositivo consumiu eletricidade. Isso é determinado pelo comportamento do dispositivo, pela interação das pessoas e pela forma como o app aplicou a orientação ao dispositivo. Para um fabricante de veículos elétricos, isso seria o comportamento da sessão de carregamento do veículo. Para gerar insights sobre o carregamento do veículo em relação à limpeza e ao custo relativo da eletricidade consumida, é necessário que o app envie feedback ao EnergyKit. Chamamos esse feedback de LoadEvents. O ideal é criar eventos à medida que o veículo carrega e ocorrem alterações no estado de carga durante a sessão de carregamento. Quando uma sessão de carregamento começar, crie um evento que represente o estado inicial do veículo. Durante o carregamento do veículo, crie eventos periodicamente. Recomendamos um evento a cada 15 minutos quando o veículo estiver carregando em um ritmo constante. Crie eventos quando ocorrer algo significativo, como uma pausa na sessão, uma alteração no horário de carregamento devido a um novo conjunto de orientações ou uma mudança rápida no consumo de energia. No final da sessão, encerre-a com um evento que represente o estado final do veículo. Para gerar insights com base nos eventos criados, é necessário enviá-los ao EnergyKit. Os eventos podem ser enviados assim que ocorrem ou em lotes, ou ainda todos juntos no final da sessão de carregamento. Recomendamos o envio em lote para melhorar o desempenho. Não envie eventos entre sessões de carregamento. Vamos ver como criar e enviar esses eventos. Para um sessão de carregamento, as informações mais importantes são: O estado de carga da bateria, a energia consumida em determinada instância e a energia total consumida desde o início da sessão. O início da sessão é quando o veículo começa a ser carregado.

    Esse evento é o estado inicial do veículo no início da sessão de carregamento. guidanceState indica se a sessão foi iniciada porque o horário de carregamento seguiu a orientação de eletricidade, representada por guidanceToken. Esse token é exclusivo do telefone que recebeu a orientação em vigor, e deve ser usado para criar eventos nesse telefone. À medida que o carregamento avança, a sessão é marcada como ativa. Depois, ela é encerrada com um evento de término. Esse evento é o estado final do veículo no fim da sessão de carregamento. No nosso app de exemplo, criamos LoadEvents e os armazenamos em cache até os enviarmos em lote. Esses eventos são enviados ao EnergyVenue em que o veículo estava sendo carregado. Os eventos enviados são armazenados em conformidade com as políticas de privacidade da Apple, com armazenamento no Core Data no dispositivo e backup criptografado de ponta a ponta no CloudKit. Esses dados também são compartilhados com todas as pessoas que já compartilham uma residência no HomeKit em associação ao EnergyVenue para o qual os eventos são enviados. Finalmente, temos todas as informações necessárias para gerar insights. Para isso, começamos criando uma consulta para especificar que queremos insights sobre limpeza e custo relativo, se disponíveis. No nosso app de exemplo, queremos mostrar um resumo do consumo de eletricidade de um dia que já passou. Com a consulta criada, podemos obter insights sobre o veículo em um ponto onde ele já foi carregado antes. Recebemos um AsyncStream, e como queremos o insight de um dia específico, podemos filtrar o fluxo de acordo com esse requisito. O insight recebido já pode ser usado para criar um resumo. Pronto, seu app está integrado ao EnergyKit. Nesta sessão, falamos sobre os fundamentos da interação com o EnergyKit. Para a integração, analisamos como as pessoas interagiriam com o seu app para escolher um EnergyVenue. Depois, explicamos como utilizar o EnergyVenue escolhido, obter orientações de eletricidade e usá-las para definir um horário de carregamento.

    Depois de definir esse horário, enquanto o veículo era carregado, explicamos a importância de enviar feedback ao EnergyKit na forma de LoadEvents para promover a geração de insights. Por fim, vimos como podemos solicitar insights com base na orientação recebida e no feedback enviado pelo app para desenvolver a experiência do usuário. Você pode baixar o app de exemplo usado nesta sessão e acessar a documentação do EnergyKit em developer.apple.com. Nosso compromisso na Apple é proteger o meio ambiente. Saiba mais sobre isso em apple.com/br/2030. Estamos animados para ver os apps incríveis que você vai criar com o 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 - Introdução
    • O framework EnergyKit permite integrar informações da rede elétrica local aos apps para que as pessoas reduzam o uso, economizem dinheiro e priorizem fontes de energia mais limpas ao utilizar dispositivos como termostatos inteligentes ou recarregar veículos elétricos.

    • 2:08 - Integrar o EnergyKit
    • Para integrar o EnergyKit, os usuários escolhem usar o carregamento com energia limpa em um local específico. O app recupera o local (conhecido como EnergyVenue) e armazena o identificador dele.

    • 3:28 - Gerar um cronograma de carregamento
    • O EnergyKit fornece orientações sobre eletricidade com base na localização, nas informações da rede e nos dados da concessionária para criar um cronograma de carregamento com energia limpa. Ele pode sugerir ações de redução (para dispositivos como termostatos inteligentes) ou de mudança (para usos como carregamento de veículos elétricos). As orientações sobre eletricidade priorizam horários fora de pico, que são mais puros e baratos, otimizando os custos e reduzindo o impacto ambiental.

    • 7:35 - Insights
    • Os insights do EnergyKit ajudam a simplificar a apresentação das informações sobre eletricidade para os usuários e podem categorizar o uso da eletricidade com base na pureza da rede elétrica. Para que os fabricantes de veículos elétricos gerem informações, os apps fornecem feedback ao EnergyKit na forma de eventos de carga que acompanham o progresso durante a sessão de recarga. Ao enviar esses eventos em lote, o EnergyKit pode analisar com precisão os dados de recarga.

    • 14:58 - Próximas etapas
    • Adote o EnergyKit nos seus apps que gerenciam o uso de eletricidade. Para obter mais informações, consulte a amostra de código que acompanha a sessão.

Developer Footer

  • Vídeos
  • WWDC25
  • Torne o consumo de energia da sua casa mais eficiente com o 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