-
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
Videos relacionados
WWDC25
-
Buscar este video…
-
-
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.