HAP icon indicating copy to clipboard operation
HAP copied to clipboard

Speaker code...

Open davemen opened this issue 1 year ago • 0 comments

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) }

davemen avatar Feb 15 '25 20:02 davemen