Reprezentarea unui dispozitiv care se încarcă prin meter.
id (UUID) unicstartTime <= currentTime <= endTime| Proprietate | Tip | Descriere | Observaţii |
|---|---|---|---|
id |
UUID | Identificator unic | Generat la creare |
deviceName |
String | Nume ales de utilizator | De ex: "My iPhone 15" |
deviceClass |
ChargedDeviceClass | Tip: iPhone, Watch, Charger, Powerbank, Other | |
kind |
ChargedDeviceKind | Device sau Charger | Derivat din deviceClass |
createdAt |
Date | Data creării | Immutable |
chargeRecords |
[ChargeRecord] | Lista sesiunilor de încărcare | Sorted by startTime |
totalEnergy |
Double | Total Wh consumat/furnizat | Calculat din sesiuni |
lastChargedAt |
Date? | Data ultimei sesiuni | Nullable |
// Gestionare sesiuni
func startSession(meter: Meter) -> ChargeRecord
// MUST: sessionID este UUID unic
// MUST: startTime = now()
// MUST: retur ChargeRecord cu status "active"
func recordMeasurement(_ measurement: Measurement, in session: ChargeRecord)
// MUST: measurement.timestamp > session.startTime
// SHOULD: measure-urile sunt colectate la ~1Hz
// MUST: nu merge dacă sesiunea e finalizată
func endSession(_ record: ChargeRecord)
// MUST: endTime = now()
// MUST: calculează total energy din măsurători
// MUST: marchez sesiunea ca "completed"
func recalculateTotalEnergy()
// Recalculează sum-ul de Wh din toate sesiunile
// SHOULD: se apelează după conflict resolution
// Naming
func renameToDevice(_ newName: String)
// MUST: actualizează proprietatea şi persistă
// Conflict handling
func mergeWith(_ other: ChargedDevice, keepingRecords: Bool = true)
// MUST: combină sessions de pe ambele device-uri
// MUST: remove-ă duplicates după MAC address
// SHOULD: logs merge operation pentru debug
Se declanşează când: 1. Două sesiuni cu aceeași categorie de device în same time window 2. Două sesiuni pe aceeași meter cu overlap temporal
Rezoluţie: - MUST: Sesiunea cu mai multe măsurători = "winner" - MUST: Energiile sunt combinate (∑) - SHOULD: Old session data este archived (Core Data snapshot) - MAY: Notifică utilizator despre merge
// Sesiuni
test_startSessionCreatesValidRecord()
test_endSessionCalculatesEnergy()
test_activeSessions_CanOnlyBeOne()
test_sessionTimeValidation()
// Măsurători
test_recordMeasurementFailsIfSessionEnded()
test_measurementsAreOrdered()
test_emptySessionsCalculateZeroEnergy()
// Conflict
test_mergeDetectsDuplicateSessions()
test_mergeKeepsMoreCompleteMeasurements()
test_mergeRecalculates_TotalEnergy()
// Naming
test_renameUpdatesPersistence()
Meter: conectare şi măsurătoriChargeInsightsStore: persistență sesiuniCloudKitSync: replicare iCloudDocumentaţie asoc: - Charge Session Integrity - No Ampere-Hours in UI