{"id":13583639,"url":"https://github.com/hobbyquaker/homekit2mqtt","last_synced_at":"2025-04-04T10:06:15.889Z","repository":{"id":57266366,"uuid":"42358094","full_name":"hobbyquaker/homekit2mqtt","owner":"hobbyquaker","description":"HomeKit to MQTT bridge 🏡📱","archived":false,"fork":false,"pushed_at":"2022-02-04T13:33:55.000Z","size":2660,"stargazers_count":346,"open_issues_count":41,"forks_count":69,"subscribers_count":37,"default_branch":"master","last_synced_at":"2024-04-14T06:28:32.985Z","etag":null,"topics":["bridge","homekit","mqtt","siri","smarthome"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hobbyquaker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-09-12T13:32:45.000Z","updated_at":"2024-04-08T16:12:41.000Z","dependencies_parsed_at":"2022-08-25T03:41:05.302Z","dependency_job_id":null,"html_url":"https://github.com/hobbyquaker/homekit2mqtt","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hobbyquaker%2Fhomekit2mqtt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hobbyquaker%2Fhomekit2mqtt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hobbyquaker%2Fhomekit2mqtt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hobbyquaker%2Fhomekit2mqtt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hobbyquaker","download_url":"https://codeload.github.com/hobbyquaker/homekit2mqtt/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247156236,"owners_count":20893196,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bridge","homekit","mqtt","siri","smarthome"],"created_at":"2024-08-01T15:03:40.178Z","updated_at":"2025-04-04T10:06:15.846Z","avatar_url":"https://github.com/hobbyquaker.png","language":"JavaScript","funding_links":[],"categories":["Uncategorized","Interfaces","JavaScript"],"sub_categories":["Twitter","Smart Home Integration Software"],"readme":"# homekit2mqtt \n\n[![mqtt-smarthome](https://img.shields.io/badge/mqtt-smarthome-blue.svg)](https://github.com/mqtt-smarthome/mqtt-smarthome)\n[![NPM version](https://badge.fury.io/js/homekit2mqtt.svg)](http://badge.fury.io/js/homekit2mqtt)\n[![dependencies Status](https://david-dm.org/hobbyquaker/homekit2mqtt/status.svg)](https://david-dm.org/hobbyquaker/homekit2mqtt)\n[![Build Status](https://travis-ci.org/hobbyquaker/homekit2mqtt.svg?branch=master)](https://travis-ci.org/hobbyquaker/homekit2mqtt)\n[![Coverage Status](https://coveralls.io/repos/github/hobbyquaker/homekit2mqtt/badge.svg?branch=master)](https://coveralls.io/github/hobbyquaker/homekit2mqtt?branch=master)\n[![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/sindresorhus/xo)\n[![License][mit-badge]][mit-url]\n\nHomeKit to MQTT bridge 🏡📱\n\n\u003e Depends on [HAP-NodeJS](https://github.com/KhaosT/HAP-NodeJS) by [KhaosT](https://github.com/KhaosT), all credits belong to him.\n\nThis project follows the [mqtt-smarthome architecture](https://github.com/mqtt-smarthome).\nI'm using this to control a multitude of MQTT-connected \"Things\" in my home automation through Siri and with HomeKit apps.\n\n***Warning***: Version 0.9.4 possibly introduces a breaking change. Due to the issue #89 service subtypes where \nadded, please give your Home app a few minutes to get updates, if the accessories don't work at all anymore after an \nupdate from \u003c=0.9.3 to \u003e=0.9.4 you have to delete the persistence files and delete and re-add the bridge in iOS...:-(\n\n## Installation\n\n**Requirements** \n\n * Debian, Ubuntu, Raspbian or macOS\n * [Node.js](https://nodejs.org) 6 or higher\n * If you want to use the Camera Service [FFmpeg](https://www.ffmpeg.org/) has to be installed (on Linux: `sudo apt install ffmpeg`)\n\n`sudo npm install -g homekit2mqtt --unsafe-perm`   \n\nI suggest to use [pm2](http://pm2.keymetrics.io/) to manage the homekit2mqtt process (start on system boot, manage log \nfiles, ...)\n\n\n## Command Line Options\n\n\u003cpre\u003e\nUsage: homekit2mqtt [options]\n\nOptions:\n  -v, --verbosity       possible values: \"error\", \"warn\", \"info\", \"debug\"\n                                                               [default: \"info\"]\n  -m, --mapfile         JSON file containing HomeKit Services to MQTT mapping\n                        definitions. See Readme.                       [default:\n                                                  \"./example-homekit2mqtt.json\"]\n  -n, --name            instance name. used as prefix for connected topic\n                                                            [default: \"homekit\"]\n  -u, --url             mqtt broker url.           [default: \"mqtt://127.0.0.1\"]\n  -s, --storagedir      directory to store homekit data\n  -p, --port            port homekit2mqtt is listening on       [default: 51826]\n  -w, --web-port        port webserver is listening on          [default: 51888]\n  -x, --disable-web     disable webserver\n  --disable-json-parse  disable json parsing of received mqtt payloads [boolean]\n  --insecure            allow tls connections with invalid certificates[boolean]\n  --retain              if set, ALL MQTT messages sent will have the retain flag\n                        set                                            [boolean]\n  -h, --help            Show help                                      [boolean]\n  --version             Show version number                            [boolean]\n  -c, --pincode                                          [default: \"031-45-154\"]\n  -a, --username                                  [default: \"CC:22:3D:E3:CE:F6\"]\n  -b, --bridgename                                      [default: \"MQTT Bridge\"]\n\n                                                             \n\u003c/pre\u003e\n\n#### Persisted Data\n\nI strongly advice you to set the `--storagedir` and `--mapfile` option to a directory outside of the homekit2mqtt \nfolder, otherwise an update of homekit2mqtt could overwrite your config.\n\n#### MQTT Authentication and TLS\n\nYou can put credentials for authentication in the url supplied to the `--url` option: `mqtt://user:password@broker`. If\nyou want to use TLS for the connection to the broker use `mqtts://` as URL scheme, e.g. `mqtts://broker:8883`.\n\n#### MQTT Payload parsing\n\nBy default homekit2mqtt parses incoming JSON payloads and tries to use the attribute `val` (following \n[mqtt-smarthome payload convention](https://github.com/mqtt-smarthome/mqtt-smarthome/blob/master/Architecture.md)). For\na future release it is planned that this attribute will be configurable \n(see https://github.com/hobbyquaker/homekit2mqtt/issues/67).\n\nIf you set the `--disable-json-parse` option there will be no JSON parsing at all and homekit2mqtt just hands the \nincoming JSON through as string.\n\nPlain (non-JSON) payloads containing the strings `true` or `false` are casted to boolean. Strings containing numbers\nare casted to numbers with parseFloat().\n\n\n## Configuration\n\nhomekit2mqtt needs a JSON file that defines devices and mappings from MQTT-topics and payloads to \nHomeKit-characteristics. You can either create this manually or use the Web UI to configure homekit2mqtt. The Webserver\nlistens on Port 51888 by default, authentication username is `homekit` and the password is the pincode (`031-45-154` by\ndefault).\n\n![Web UI](docs/screen1.png)\n![Web UI](docs/screen2.png)\n\nSee [example-homekit2mqtt.json](example-homekit2mqtt.json) for an example configuration. Every Accessory is represented \nlike this in the JSON file:\n\n```javascript\n  \"TemperatureSensor\": {                                    // Unique name - used to generate the accessory UUID\n    \"name\": \"TemperatureSensor LivingRoom\",                 // Accessory name\n    \"services\": [\n        {\n            \"service\": \"TemperatureSensor\",                 // HomeKit service type (see available service types below)\n            \"name\": \"Temperature LivingRoom\",               // Service name\n            \"topic\": {                                              \n                // ... MQTT topic configuration ...\n            },\n            \"payload\": {\n                // ... MQTT payload configuration ...\n            },\n            \"props\": {\n                // ... Optional Characteristic properties\n            },\n            \"config\": {\n                // ... Optional Service configuration\n            }       \n        },\n        // ... more services\n    ],\n    \"manufacturer\": \"DIY Home Brew\",                        // Additional accessory infos (optional)\n    \"model\": \"TemperatureSensor\"                            // Additional accessory infos (optional)\n  }\n```\n## Available Service Types\n\n#### AirPurifier\n\ntopic\n\n* statusActive\n* setActive\n* statusCurrentAirPurifierState    \n  0 = INACTIVE, 1 = IDLE, 2 = PURIFYING_AIR\n* statusTargetAirPurifierState    \n  0 = MANUAL, 1 = AUTO\n* setTargetAirPurifierState    \n  0 = MANUAL, 1 = AUTO\n* statusLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* setLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* statusSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* setLockSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* statusRotationSpeed (optional)    \n  Percentage 0-100\n* setRotationSpeed (optional)    \n  Percentage 0-100\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* rotationSpeedFactor (optional, default: `1`)\n\n\n#### AirQualitySensor\n\ntopic\n\n* statusAirQuality    \n  0 = UNKNOWN, 1 = EXCELLENT, 2 = GOOD, 3 = FAIR, 4 = INFERIOR, 5 = POOR\n* statusOzoneDensity (optional)\n* statusNitrogenDioxideDensity (optional)\n* statusSulphurDioxideDensity (optional)\n* statusPM2_5Density (optional)\n* statusPM10Density (optional)\n* statusVOCDensity (optional)\n* statusCarbonMonoxideLevel (optional)\n* statusCarbonDioxideLevel (optional)\n* onLowBattery (optional)\n* onTampered (optional)\n* onActive (optional)\n* onFault (optional)\n\npayload\n\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### BatteryService\n\ntopic\n\n* statusBatteryLevel    \n  Percentage 0-100\n* statusChargingState    \n  0 = NOT_CHARGING, 1 = CHARGING, 2 = NOT_CHARGEABLE\n* statusLowBattery    \n  0 = BATTERY_LEVEL_NORMAL, 1 = BATTERY_LEVEL_LOW\n\npayload\n\n* onLowBattery\n* invertLowBattery (optional, default: `false`)\n* minBatteryLevel (optional, default: `0`)\n* maxBatteryLevel (optional, default: `100`)\n\n\n#### CameraRTSPStreamManagement\n\ntopic\n\n\npayload\n\n\nconfig\n\n* source  (default: `-re -i rtsp://myfancy_rtsp_stream`)\n* stillImageSource  (default: `-i http://faster_still_image_grab_url/this_is_optional.jpg`)\n* maxStreams  (default: `2`)    \n  the maximum number of streams that will be generated for this camera\n* maxWidth  (default: `1280`)\n* maxHeight  (default: `720`)\n* maxFPS  (default: `10`)    \n  the maximum frame rate of the stream\n* maxBitrate  (default: `300`)    \n  the maximum bit rate of the stream in kbit/s\n* vcodec  (default: `libx264`)    \n  If you're running on a RPi with the omx version of ffmpeg installed, you can change to \"h264_omx\" for hardware accelerated video codec\n* audio     \n  can be set to true to enable audio streaming from camera. To use audio ffmpeg must be compiled with --enable-libfdk-aac, see https://github.com/KhaosT/homebridge-camera-ffmpeg/wiki\n* packetSize  (default: `1316`)    \n  If audio or video is choppy try a smaller value, set to a multiple of 188\n* debug     \n  Show the output of ffmpeg in the log\n* videoProcessor  (default: `ffmpeg`)\n\n\n#### CarbonDioxideSensor\n\ntopic\n\n* statusCarbonDioxideDetected\n* statusCarbonDioxideLevel (optional)\n* statusCarbonDioxidePeakLevel (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onCarbonDioxideDetected\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### CarbonMonoxideSensor\n\ntopic\n\n* statusCarbonMonoxideDetected\n* statusCarbonMonoxideLevel (optional)\n* statusCarbonMonoxidePeakLevel (optional)\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onCarbonMonoxideDetected\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### ContactSensor\n\ntopic\n\n* statusContactSensorState\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onContactDetected\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### Door\n\ntopic\n\n* setTargetPosition\n* statusTargetPosition (optional)\n* statusCurrentPosition (optional)\n* statusPositionState (optional)\n* statusObstruction (optional)\n* setHoldPosition (optional)\n\npayload\n\n* targetPositionFactor (optional)\n* currentPositionFactor (optional)\n* positionStatusDecreasing (optional)\n* positionStatusIncreasing (optional)\n* onObstructionDetected (optional)\n* holdPositionTrue (optional, default: `true`)\n* holdPositionFalse (optional, default: `false`)\n\n\n#### Doorbell\n\ntopic\n\n* statusEvent\n\npayload\n\n\n\n#### Fan\n\ntopic\n\n* setOn\n* statusOn (optional)\n* setRotationDirection (optional)\n* statusRotationDirection (optional)\n* setRotationSpeed (optional)\n* statusRotationSpeed (optional)\n\npayload\n\n* onTrue (optional, default: `true`)\n* onFalse (optional, default: `false`)\n* rotationDirectionCounterClockwise (optional, default: `1`)\n* rotationDirectionClockwise (optional, default: `0`)\n* rotationSpeedFactor (optional, default: `1`)\n\n\n#### Fanv2\n\ntopic\n\n* statusActive\n* setActive\n* statusCurrentFanState    \n  0 = INACTIVE, 1 = IDLE, 2 = PURIFYING_AIR\n* statusTargetFanState    \n  0 = MANUAL, 1 = AUTO\n* setTargetFanState    \n  0 = MANUAL, 1 = AUTO\n* statusLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* setLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* statusSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* setLockSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* statusRotationSpeed (optional)    \n  Percentage 0-100\n* setRotationSpeed (optional)    \n  Percentage 0-100\n* statusRotationDirection (optional)    \n  0 = CLOCKWISE, 1 = COUNTER_CLOCKWISE\n* setRotationDirection (optional)    \n  0 = CLOCKWISE, 1 = COUNTER_CLOCKWISE\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* rotationSpeedFactor (optional, default: `1`)\n\n\n#### Faucet\n\ntopic\n\n* setActive\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* faultTrue (optional, default: `true`)\n* invertFault (optional, default: `false`)\n\n\n#### FilterMaintenance\n\ntopic\n\n* statusFilterChangeIndication\n* statusFilterLifeLevel (optional)    \n  Percentage 0-100\n* setResetFilterIndication (optional)\n\npayload\n\n\n\n#### GarageDoorOpener\n\ntopic\n\n* setDoor\n* statusDoor (optional)    \n  0 = OPEN, 1 = CLOSED; 2 = OPENING, 3 = CLOSING, 4 = STOPPED\n* statusObstruction (optional)\n* setLock (optional)\n* statusLock (optional)\n\npayload\n\n* doorClosed (optional)\n* doorOpening (optional)\n* doorClosing (optional)\n* doorStopped (optional)\n* onObstructionDetected (optional)\n* lockUnsecured (optional)\n* lockSecured (optional)\n\n\n#### HeaterCooler\n\ntopic\n\n* statusActive\n* setActive\n* statusCurrentTemperature\n* statusCurrentHeaterCoolerState    \n  0 = INACTIVE, 1 = IDLE, 2 = HEATING, 3 = COOLING\n* statusTargetHeaterCoolerState    \n  0 = AUTO, 1 = HEAT, 2 = COOL\n* setTargetHeaterCoolerState    \n  0 = AUTO, 1 = HEAT, 2 = COOL\n* statusLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* setLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* statusSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* setLockSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* statusRotationSpeed (optional)    \n  Percentage 0-100\n* setRotationSpeed (optional)    \n  Percentage 0-100\n* statusCoolingThresholdTemperature (optional)\n* setCoolingThresholdTemperature (optional)\n* statusHeatingThresholdTemperature (optional)\n* setHeatingThresholdTemperature (optional)\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* rotationSpeedFactor (optional, default: `1`)\n\nconfig\n\n* TemperatureDisplayUnits     \n  0 = CELSIUS, 1 = FAHRENHEIT\n\n\n#### HumidifierDehumidifier\n\ntopic\n\n* statusActive\n* setActive\n* statusCurrentTemperature\n* statusWaterLevel    \n  Percentage 0-100\n* statusCurrentHumidifierDehumidifierState    \n  0 = INACTIVE, 1 = IDLE, 2 = HUMIDIFYING, 3 = DEHUMIDIFYING\n* statusTargetHumidifierDehumidifierState    \n  0 = HUMIDIFIER_OR_DEHUMIDIFIER, 1 = HUMIDIFIER, 2 = DEHUMIDIFIER\n* setTargetHumidifierDehumidifierState    \n  0 = HUMIDIFIER_OR_DEHUMIDIFIER, 1 = HUMIDIFIER, 2 = DEHUMIDIFIER\n* statusLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* setLockPhysicalControls (optional)    \n  0 = CONTROL_LOCK_DISABLED, 1 = CONTROL_LOCK_ENABLED\n* statusSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* setLockSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* statusRotationSpeed (optional)    \n  Percentage 0-100\n* setRotationSpeed (optional)    \n  Percentage 0-100\n* statusRelativeHumidityDehumidifierThreshold (optional)\n* setRelativeHumidityDehumidifierThreshold (optional)\n* statusRelativeHumidityHumidifierThreshold (optional)\n* setRelativeHumidityHumidifierThreshold (optional)\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* rotationSpeedFactor (optional, default: `1`)\n* waterLevelFactor (optional, default: `1`)\n\n\n#### HumiditySensor\n\ntopic\n\n* statusHumidity\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### IrrigationSystem\n\ntopic\n\n* setActive\n* statusActive\n* statusFault (optional)\n* statusInUse\n* statusRemainingDuration\n* statusProgramMode\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* faultTrue (optional, default: `true`)\n* invertFault (optional, default: `false`)\n* inUseTrue (optional, default: `true`)\n\n\n#### LeakSensor\n\ntopic\n\n* statusLeakDetected\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onLeakDetected\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### Lightbulb\n\ntopic\n\n* setOn\n* statusOn (optional)\n* setBrightness (optional)\n* statusBrightness (optional)\n* setHue (optional)\n* statusHue (optional)\n* setSaturation (optional)\n* statusSaturation (optional)\n* setColorTemperature (optional)\n* statusColorTemperature (optional)\n* statusRGB (optional)\n* setRGB (optional)\n\npayload\n\n* onTrue\n* onFalse\n* brightnessFactor (optional, default: `1`)\n* hueFactor (optional, default: `1`)\n* saturationFactor (optional, default: `1`)\n\n\n#### LightSensor\n\ntopic\n\n* statusAmbientLightLevel    \n  0.0001 - 100000\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* ambientLightLevelFactor (optional, default: `1`)\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### LockManagement\n\ntopic\n\n* setLockControlPoint\n* statusVersion\n* statusVersion (optional)\n* statusLogs (optional)\n* setAudioFeedback (optional)\n* statusAudioFeedback (optional)\n* setLockManagementAutoSecurityTimeout (optional)    \n  Seconds\n* statusLockManagementAutoSecurityTimeout (optional)    \n  Seconds\n* setAdministratorOnlyAccess (optional)\n* statusAdministratorOnlyAccess (optional)\n* statusLockLastKnownAction (optional)    \n  0 = SECURED_PHYSICALLY_INTERIOR, 1 = UNSECURED_PHYSICALLY_INTERIOR, 2 = SECURED_PHYSICALLY_EXTERIOR, 3 = UNSECURED_PHYSICALLY_EXTERIOR, 4 = SECURED_BY_KEYPAD, 5 = UNSECURED_BY_KEYPAD, 6 = SECURED_REMOTELY, 7 = UNSECURED_REMOTELY, 8 = SECURED_BY_AUTO_SECURE_TIMEOUT\n* statusCurrentDoorState (optional)    \n  0 = OPEN, 1 = CLOSED; 2 = OPENING, 3 = CLOSING, 4 = STOPPED\n* statusMotionDetected (optional)\n\npayload\n\n* doorClosed (optional)\n* doorOpening (optional)\n* doorClosing (optional)\n* doorStopped (optional)\n\n\n#### LockMechanism\n\ntopic\n\n* setLock\n* statusLock (optional)\n\npayload\n\n* lockSecured\n* lockUnsecured\n* lockJammed (optional)\n* lockUnknown (optional)\n\n\n#### Microphone\n\ntopic\n\n* setMute\n* statusMute (optional)\n* setVolume (optional)\n* statusVolume (optional)\n\npayload\n\n* muteTrue\n* muteFalse\n* volumeFactor (optional, default: `1`)\n\n\n#### MotionSensor\n\ntopic\n\n* statusMotionDetected\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onMotionDetected\n* onLowBattery (optional)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### OccupancySensor\n\ntopic\n\n* statusOccupancyDetected\n* statusLowBattery (optional)\n\npayload\n\n* onOccupancyDetected\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n\n\n#### Outlet\n\ntopic\n\n* setOn\n* statusOn (optional)\n* statusOutletInUse\n\npayload\n\n* onFalse\n* onTrue\n* onOutletInUse\n\n\n#### SecuritySystem\n\ntopic\n\n* setSecuritySystemTargetState    \n  0 = STAY_ARM, 1 = AWAY_ARM, 2 = NIGHT_ARM, 3 = DISARM\n* statusSecuritySystemCurrentState (optional)    \n  0 = STAY_ARM, 1 = AWAY_ARM, 2 = NIGHT_ARM, 3 = DISARMED, 4 = ALARM_TRIGGERED\n* statusSecuritySystemAlarmType (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### Slat\n\ntopic\n\n* statusCurrentSlatState    \n  0 = FIXED, 1 = JAMMED, 2 = SWINGING\n* statusCurrentTiltAngle (optional)\n* statusTargetTiltAngle (optional)\n* setTargetTiltAngle (optional)\n* statusSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n* setSwingMode (optional)    \n  0 = SWING_DISABLED, 1 = SWING_ENABLED\n\npayload\n\n\nconfig\n\n* SlatType     \n  0 = HORIZONTAL, 1 = VERTICAL\n\n\n#### SmokeSensor\n\ntopic\n\n* statusSmokeDetected\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* onSmokeDetected\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### Speaker\n\ntopic\n\n* setMute\n* statusMute (optional)\n* setVolume (optional)\n* statusVolume (optional)\n\npayload\n\n* muteTrue\n* muteFalse\n* volumeFactor (default: `1`)\n\n\n#### StatelessProgrammableSwitch\n\ntopic\n\n* statusEvent    \n  0 = SINGLE_PRESS, 1 = DOUBLE_PRESS, 2 = LONG_PRESS\n\npayload\n\n\n\n#### Switch\n\ntopic\n\n* setOn\n* statusOn (optional)\n\npayload\n\n* onFalse\n* onTrue\n\n\n#### TemperatureSensor\n\ntopic\n\n* statusTemperature\n* statusLowBattery (optional)\n* statusTampered (optional)\n* statusActive (optional)\n* statusFault (optional)\n\npayload\n\n* fahrenheit (default: `false`)    \n  Set to true if your sensor publishes values in degree fahrenheit\n* onLowBattery (optional)\n* invertLowBattery (optional, default: `false`)\n* onTampered (optional)\n* invertTampered (optional, default: `false`)\n* onActive (optional)\n* invertActive (optional, default: `false`)\n* onFault (optional)\n* invertFault (optional, default: `false`)\n\n\n#### Thermostat\n\ntopic\n\n* setTargetTemperature\n* statusTargetTemperature (optional)\n* statusCurrentTemperature\n* setTargetHeatingCoolingState (optional)    \n  0 = off, 1 = heat, 2 = cool\n* statusTargetHeatingCoolingState (optional)    \n  0 = off, 1 = heat, 2 = cool\n* statusCurrentHeatingCoolingState (optional)    \n  0 = off, 1 = heat, 2 = cool\n* setTargetRelativeHumidity (optional)\n* statusTargetRelativeHumidity (optional)\n* statusCurrentRelativeHumidity (optional)\n* setCoolingThresholdTemperature (optional)\n* statusCoolingThresholdTemperature (optional)\n* setHeatingThresholdTemperature (optional)\n* statusHeatingThresholdTemperature (optional)\n\npayload\n\n\nconfig\n\n* TemperatureDisplayUnits     \n  0 = CELSIUS, 1 = FAHRENHEIT\n\n\n#### Valve\n\ntopic\n\n* setActive\n* statusActive\n* statusFault (optional)\n* statusInUse\n* statusRemainingDuration (optional)\n* setDuration (optional)\n\npayload\n\n* activeTrue (optional, default: `true`)\n* invertActive (optional, default: `false`)\n* faultTrue (optional, default: `true`)\n* invertFault (optional, default: `false`)\n* inUseTrue (optional, default: `true`)\n\nconfig\n\n* ValveType  (optional, default: `0`)    \n  0 = GENERIC_VALVE, 1 = IRRIGATION, 2 = SHOWER_HEAD, 3 = WATER_FAUCET\n\n\n#### Window\n\ntopic\n\n* setTargetPosition\n* statusTargetPosition (optional)\n* statusCurrentPosition (optional)\n* statusPositionState (optional)\n* statusObstruction (optional)\n\npayload\n\n* targetPositionFactor (optional, default: `1`)\n* currentPositionFactor (optional, default: `1`)\n* positionStatusDecreasing (optional)\n* positionStatusIncreasing (optional)\n* onObstructionDetected (optional)\n\n\n#### WindowCovering\n\ntopic\n\n* setTargetPosition\n* statusTargetPosition (optional)\n* statusCurrentPosition (optional)\n* statusPositionState (optional)\n* statusTargetHorizontalTiltAngle (optional)\n* setTargetHorizontalTiltAngle (optional)\n* statusTargetVerticalTiltAngle (optional)\n* setTargetVerticalTiltAngle (optional)\n* statusCurrentHorizontalTiltAngle (optional)\n* statusCurrentVerticalTiltAngle (optional)\n\npayload\n\n* targetPositionFactor (optional, default: `1`)\n* currentPositionFactor (optional, default: `1`)\n* positionStatusDecreasing (optional)\n* positionStatusIncreasing (optional)\n\n\n\n## License\n\nMIT © [Sebastian Raff](https://github.com/hobbyquaker) and homekit2mqtt contributors\n\n\n[mit-badge]: https://img.shields.io/badge/License-MIT-blue.svg?style=flat\n[mit-url]: LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhobbyquaker%2Fhomekit2mqtt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhobbyquaker%2Fhomekit2mqtt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhobbyquaker%2Fhomekit2mqtt/lists"}