iOS/Sources/Shared/API/Webhook/Sensors/WatchBatterySensor.swift
Bruno Pantaleão Gonçalves 16f5a1bc75
Simplify and migrate onboarding screens to SwiftUI (#3527)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->



https://github.com/user-attachments/assets/e79c6e4d-13ff-405a-9463-02e597ce4996
2025-04-08 23:54:34 +02:00

64 lines
2.1 KiB
Swift

import Communicator
import Foundation
import PromiseKit
final class WatchBatterySensor: SensorProvider {
let request: SensorProviderRequest
init(request: SensorProviderRequest) {
self.request = request
}
func sensors() -> Promise<[WebhookSensor]> {
var sensors: [WebhookSensor] = []
#if !os(watchOS)
switch Communicator.shared.currentWatchState {
case .paired:
let batteryState: DeviceBattery.State? = {
if let rawValue = Communicator.shared.mostRecentlyReceievedContext
.content[WatchContext.watchBatteryState.rawValue] as? Int,
let deviceBatteryState = UIDevice.BatteryState(rawValue: rawValue) {
return .init(state: deviceBatteryState)
} else {
return nil
}
}()
let batteryDecimal = Communicator.shared.mostRecentlyReceievedContext
.content[WatchContext.watchBattery.rawValue] as? Float
let batteryLevel: Int? = {
if let batteryDecimal {
return Int(batteryDecimal * 100)
} else {
return nil
}
}()
let icon: String = BatteryIcon.forBatteryLevel(batteryLevel ?? 0, state: batteryState ?? .unplugged)
if let batteryLevel {
sensors.append(WebhookSensor(
name: "Watch Battery Level",
uniqueID: WebhookSensorId.watchBattery.rawValue,
icon: icon,
deviceClass: .battery,
state: batteryLevel,
unit: "%"
))
}
if let batteryState {
sensors.append(WebhookSensor(
name: "Watch Battery State",
uniqueID: WebhookSensorId.watchBatteryState.rawValue,
icon: icon,
state: batteryState.description
))
}
case .notPaired:
break
}
#endif
return .value(sensors)
}
}