-
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
Vidéos connexes
WWDC25
-
Rechercher dans cette vidéo…
-
-
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.