Skip to content

Speaker code... #169

@davemen

Description

@davemen

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions