Speaker code...
Has anyone gotten speaker code working? I keep getting "This accessory is not currently supported by the Home App"
import Foundation import HAP import Logging
fileprivate let logger = Logger(label: "homekit-speaker")
#if os(Linux) import Dispatch #endif
var keepRunning = true
// ✅ Fix: Use a global function for signal handling func stopSignalHandler(_ signal: Int32) { DispatchQueue.main.async { logger.info("Shutting down...") keepRunning = false } }
// MARK: - HomeKit Speaker Accessory class SimpleSpeaker: Accessory { init() { // Required Characteristic: Mute let muteCharacteristic = AnyCharacteristic(GenericCharacteristic( type: .mute, value: false, permissions: [.read, .write, .events] ))
// Optional Characteristic: Volume (0-100)
let volumeCharacteristic = AnyCharacteristic(GenericCharacteristic(
type: .volume,
value: 50,
permissions: [.read, .write, .events],
maxValue: 100, minValue: 0
))
let speakerService = Service(
type: .speaker,
characteristics: [muteCharacteristic, volumeCharacteristic]
)
super.init(
info: .init(
name: "Basic Speaker",
serialNumber: "12345678",
manufacturer: "MyCompany",
model: "Speaker-001",
firmwareRevision: "1.0"
),
type: .speaker,
services: [speakerService]
)
}
}
// MARK: - Start HAP Server do { // Reset Pairing Storage (Clears stale pairings) let storageFile = "hap-storage.json" try? FileManager.default.removeItem(atPath: storageFile)
// Set up persistent storage
let storage = try FileStorage(filename: storageFile)
// Create the HomeKit speaker accessory
let speaker = SimpleSpeaker()
// Initialize the HomeKit device
let device = HAP.Device(
setupCode: "700-70-700",
storage: storage,
accessory: speaker
)
let server = try HAP.Server(device: device, listenPort: 0)
// ✅ Fix: Use a global function for handling signals
signal(SIGINT, stopSignalHandler)
signal(SIGTERM, stopSignalHandler)
print()
print("Scan the following QR code using your iPhone to pair this device:")
print()
print(device.setupQRCode.asText)
print()
// Keep server running
while keepRunning {
RunLoop.current.run(mode: .default, before: Date.distantFuture)
}
try server.stop()
logger.info("Stopped")
} catch { logger.error("❌ Failed to start HomeKit accessory: (error)") exit(1) }