homebridge-http-lightbulb
is a Homebridge plugin with which you can configureHomeKit light bulbs which forward any requests to a defined http server. This comes in handy when you already have homeautomated equipment which can be controlled via http requests. Or you have built your own equipment, for example some sortof lightning controlled with an wifi enabled Arduino board which than can be integrated via this plugin into Homebridge.
First of all you need to have Homebridge installed. Refer to the repo forinstructions.
Then run the following command to install homebridge-http-lightbulb
sudo npm install -g homebridge-http-lightbulb
All characteristic from the 'lightbulb' service have the permission to notify
the HomeKit controller of statechanges. homebridge-http-lightbulb
supports two concepts to send state changes to HomeKit.
The 'pull' way is probably the easiest to set up and supported in every scenario. homebridge-http-lightbulb
requests thestate of the light in an specified interval (pulling) and sends the value to HomeKit.However the pull way is currently only supported for the 'On' characteristic!
Look for pullInterval
in the list of configuration options if you want to configure it.
When using the 'push' concept, the http device itself sends the updated value to homebridge-http-lightbulb
whenevervalues change. This is more efficient as the new value is updated instantly and homebridge-http-lightbulb
does notneed to make needless requests when the value didn't actually change.
However because the http device needs to actively notify the homebridge-http-lightbulb
there is more work neededto implement this method into your http device.
MQTT (Message Queuing Telemetry Transport) is a protocol widely used by IoT devices. IoT devices can publish messageson a certain topic to the MQTT broker which then sends this message to all clients subscribed to the specified topic.In order to use MQTT you need to setup a broker server (mosquitto is a solidopen source MQTT broker running perfectly on a device like the Raspberry Pi) and then instruct all clients topublish/subscribe to it.
For those of you who are developing the http device by themselves I developed a pretty simple 'protocol' based on httpto send push-updates.
How to implement the protocol into your http device can be read in the chapterNotification Server
The configuration can contain the following properties:
accessory
<string> required: Defines the plugin used and must be set to "HTTP-LIGHTBULB" for this plugin.name
<string> required: Defines the name which is later displayed in HomeKitonUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) which is called when you turn on the light bulb.offUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) which is called when you turn off the light bulb.statusUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) to query the current power state from the light bulb. By default it expects the http server toreturn '1' for ON and '0' for OFF leaving out any html markup.statusPattern
option (see below).statusPattern
<string> optional (Default: "1"): Defines a regex pattern which is compared to thebody of the http response from the statusUrl
. When matching the status of the light bulb is set to ON otherwise OFF.brightness
<object> optional: Defines everything related to the 'Brightness' characteristic:
setUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) which is called when you set a new brightness level. The brightness is sent in the given unit.statusUrl
<string | urlObject> required: Defines the url (and other properties when usingand urlObject) to query the current brightness level from the light bulb. By default it expects the http serverto return the brightness level in percent (range from 0-100). This can be changed with the unit
property below.unit
<string> optional (Default: "percent"): Defines unit expected from the http server. The followingare available:
statusPattern
<string> optional (Default: "([0-9]{1,3})"): Defines a regex pattern with which thebrightness is extracted from the body of the http response from the brightness.statusUrl
. The group which shouldbe extracted can be configured with the brightness.patternGroupToExtract
property.patternGroupToExtract
<\number> optional (Default: 1): Defines the regex group of which the brightnessis extracted.withholdPowerUpdate
<\boolean> optional (Default: false): The Home App has the quirk that when settingbrightness it also send a request to turn the lamp on immediately afterwards. This may be annoying behaviour forsome people. When this property is to to true the plugin prevents those requests.hue
<object> optional: Defines everything related to the 'Hue' characteristic:
setUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) which is called when you set a new hue.statusUrl
<string | urlObject> required: Defines the url (and other properties when usingand urlObject) to query the current hue from the light bulb.unit
<string> optional (Default: "hsv"): Defines unit expected from the http server. The followingare available:
statusPattern
<string> optional (Default: "([0-9]{1,3})" ["/([0-9]{1,5})/" when using zigbee unit]):Defines a regex pattern with which the hue is extracted from the body of the http response from thehue.statusUrl
. The group which should be extracted can be configured with thehue.patternGroupToExtract
property.patternGroupToExtract
<\number> optional (Default: 1): Defines the regex group of which the hueis extracted.saturation
<object> optional: Defines everything related to the 'Saturation' characteristic:
setUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) which is called when you set a new saturation level.statusUrl
<string | urlObject> required: Defines the url (and other properties when usingand urlObject) to query the current saturation level from the light bulb.unit
<string> optional (Default: "percent"): Defines unit expected from the http server. The followingare available:
statusPattern
<string> optional (Default: "([0-9]{1,3})"): Defines a regex pattern with which thesaturation is extracted from the body of the http response from the saturation.statusUrl
. The group which shouldbe extracted can be configured with the saturation.patternGroupToExtract
property.patternGroupToExtract
<\number> optional (Default: 1): Defines the regex group of which the saturationis extracted.colorTemperature
<object> optional: Defines everything related to the 'ColorTemperature' characteristic:colorTemperature
, hue
and saturation
must notbe defined, using all three in combination works perfectly fine.Hue
and Saturation
characteristics.When selecting something in the temperature selector the temperature is sent via the ColorTemperature
characteristic.colorTemperature
is not specified, the color temperature is sent via the Hue
and Saturation
characteristics.
setUrl
<string | urlObject> required: Defines the url (and other properties when usingan urlObject) which is called when you set a new color temperature. The color temperature is sent in the given unit.statusUrl
<string | urlObject> required: Defines the url (and other properties when usingand urlObject) to query the current color temperature from the light bulb. By default it expects the http serverto return the brightness level in mired. This can be changed with the unit
property below.unit
<string> optional (Default: "mired"): Defines unit expected from the http server. The followingare available:
minValue
<number> optional (Default: 50): Defines the minimum supported temperature in thegiven unit
. The defaut is 50 mired or 20.000 Kelvin.maxValue
<number> optional (Default: 400): Defines the maximum supported temperature in thegiven unit
. The fault is 400 mired or 2.500 Kelvin.statusPattern
<string> optional (Default: "([0-9]{2,3})" ["([0-9]{4,5})" when using Kelvin]): Defines a regex pattern with which thecolor temperature is extracted from the body of the http response from the colorTemperature.statusUrl
.The group which should be extracted can be configured with the colorTemperature.patternGroupToExtract
property.patternGroupToExtract
<\number> optional (Default: 1): Defines the regex group of which the color temperatureis extracted.auth
<object> optional: If your http server requires authentication, you can specify your credential in thisobject. It uses those credentials for all http requests and thus overrides all possibly specified credentials insidean urlObject for any characteristic.username
<string> requiredpassword
<string> requiredsendImmediately
<boolean> optional (Default: true): When set to true the plugin will send thecredentials immediately to the http server. This is best practice for basic authentication.WWW-Authenticate
header.statusCache
<number> optional (Default: 0): Defines the amount of time in milliseconds a queried valueof the On characteristic is cached before a new request is made to the http device.brightnessCache
<number> optional (Default: 0): Same as above, but for the BrightnesscharacteristichueCache
<number> optional (Default: 0): Same as above, but for the Hue characteristicsaturationCache
<number> optional (Default: 0): Same as above, but for the SaturationcharacteristiccolorTemperatureCache
<number> optional (Default: 0): Same as above, but for theColorTemperature characteristicpullInterval
<integer> optional: The property expects an interval in milliseconds in which the pluginpulls updates from your http device. For more information read pulling updates.mqtt
<mqttObject> optional: Defines all properties used for mqtt connection (More on MQTT).debug
<boolean> optional: If set to true debug mode is enabled and the plugin prints more detailed information.In the Examples section are some example configurations to get you started.
The options in this section are all part of some experimental features and can change in any update.
I'm currently experimenting with allowing setting and querying device status with mqtt alongside http.So that you are for example able to manage the ON characteristic fully over mqtt and the color andbrightness values over http. Currently this is only supported for the ON characteristic but I'm planningto add this for any combination of characteristics and in the long run also to get added into myhomebridge-http-switch plugin if everything works well.
setPowerTopic
<string | object> optional: Defines the mqtt topic to which a message is published when youturn the light on or off.
topic
<string> required:qos
<number> optional (Default: 0):retain
<boolean> optional (Default: false):dup
<boolean> optional (Default: false):payloadFormatter
<function body> optional:getPowerTopic
<string | object> optional: Defines the mqtt topic which is subscribed to in orderto receive updates of the current power state of the light.
topic
<string> required:qos
<number> optional (Default: 0):messagePattern
<string> optional:patternGroupToExtract
<number> optional (Default: 1):setUrl
propertiesOn every set there are the following placeholders available which will be replaced with the respective value.
Note that for example when the setUrl
for the brightness characteristic is called, %s
will be replaced with thenew value and %brightness
will be replaced with the current/old value.
The value for the placeholders will be supplied in the specified unit.
%s
will always be replaced with the new value which will be set for the current characteristic%brightness
- current brightness level%hue
- current hue%saturation
- current saturation%colorTemperature
- current color temperature (case sensitise)A urlObject can have the following properties:
url
<string> required: Defines the url pointing to your http servermethod
<string> optional (Default: "GET"): Defines the http method used to make the http requestbody
<any> optional: Defines the body sent with the http request. This is usually a string for maximum flexibility with placeholders. If the value is not a string, it will beconverted to a JSON string automatically.strictSSL
<boolean> optional (Default: false): If enabled the SSL certificate used must be valid andthe whole certificate chain must be trusted. The default is false because most people will work with self signedcertificates in their homes and their devices are already authorized since being in their networks.auth
<object> optional: If your http server requires authentication you can specify your credential in thisobject. When defined the object can contain the following properties:
username
<string> requiredpassword
<string> requiredsendImmediately
<boolean> optional (Default: true): When set to true the plugin will send thecredentials immediately to the http server. This is best practice for basic authentication.WWW-Authenticate
header.headers
<object> optional: Using this object you can define any http headers which are sent with the httprequest. The object must contain only string key value pairs.Below is an example of an urlObject containing all properties:
{
"url": "http://example.com:8080",
"method": "GET",
"body": "exampleBody",
"strictSSL": false,
"auth": {
"username": "yourUsername",
"password": "yourPassword"
},
"headers": {
"Content-Type": "text/html"
}
}
A mqttObject can have the following properties:
host
<string> required: Defines the host of the mqtt broker.port
<number> optional (Default: 1883): Defines the port of the mqtt broker.credentials
<object> optional: Defines the credentials used to authenticate with the mqtt broker.
username
<string> requiredpassword
<string> optionalsubscriptions
<object | array> required: Defines an array (or one single object) of subscriptions.
topic
<string> required: Defines the topic to subscribe to.characteristic
<string> required: Defines the characteristic this subscription updates.messagePattern
<string> optional: Defines a regex pattern. If messagePattern
is not specified themessage received will be used as value. If the characteristic expects a boolean value it is tested if thespecified regex is contained in the received message. Otherwise the pattern is matched against the messageand the data from regex group can be extracted using the given patternGroupToExtract
.patternGroupToExtract
<number> optional (Default: 1): Defines the regex group of which data isextracted.protocol
<string> optional (Default: "mqtt"): Defines protocol used to connect to the mqtt brokerqos
<number> optional (Default: 1): Defines the Quality of Service (Notice, the QoS of the publishermust also be configured accordingly).0
: 'At most once' - the message is sent only once and the client and broker take no additional steps toacknowledge delivery (fire and forget).1
: 'At least once' - the message is re-tried by the sender multiple times until acknowledgement isreceived (acknowledged delivery).2
: 'Exactly once' - the sender and receiver engage in a two-level handshake to ensure only one copy of themessage is received (assured delivery).clientId
<string> optional (Default: 'mqttjs_' + Math.random().toString(16).substr(2, 8)
): Defines clientIdkeepalive
<number> optional (Default: 60): Time in seconds to send a keepalive. Set to 0 to disable.clean
<boolean> optional (Default: true): Set to false to receive QoS 1 and 2 messages while offline.reconnectPeriod
<number> optional (Default: 1000): Time in milliseconds after which a reconnect is tried.connectTimeout
<number> optional (Default: 30000): Time in milliseconds the client waits until theCONNECT needs to be acknowledged (CONNACK).Below is an example of an mqttObject containing the basic properties for a light bulb service:
{
"host": "127.0.0.1",
"port": "1883",
"credentials": {
"username": "yourUsername",
"password": "yourPassword"
},
"subscriptions": [
{
"topic": "your/topic/here",
"characteristic": "On",
"messagePattern": "on"
},
{
"topic": "your/other/topic/here",
"characteristic": "Brightens",
"messagePattern": "([0-9]{1,3})"
}
]
}
This is a basic light bulb configuration supporting the required On and the optional brightness characteristic.
Note that every url is simply a string and are only examples. You could also define every url using a urlObject.
{
"accessory": "HTTP-LIGHTBULB",
"name": "Light",
"onUrl": "http://localhost/api/lightOn",
"offUrl": "http://localhost/api/lightOff",
"statusUrl": "http://localhost/api/lightStatus",
"brightness": {
"setUrl": "http://localhost/api/setBrightness?brightness=%s",
"statusUrl": "http://localhost/api/getBrightness"
}
}
{
"accessory": "HTTP-LIGHTBULB",
"name": "Light",
"onUrl": "http://localhost/api/lightOn",
"offUrl": "http://localhost/api/lightOff",
"statusUrl": "http://localhost/api/lightStatus",
"brightness": {
"setUrl": "http://localhost/api/setBrightness?brightness=%s",
"statusUrl": "http://localhost/api/getBrightness"
},
"hue": {
"setUrl": "http://localhost/api/setHue?hue=%s",
"statusUrl": "http://localhost/api/getHue"
},
"saturation": {
"setUrl": "http://localhost/api/setSaturation?saturation=%s",
"statusUrl": "http://localhost/api/getSaturation"
}
}
{
"accessory": "HTTP-LIGHTBULB",
"name": "Light",
"onUrl": "http://localhost/api/lightOn",
"offUrl": "http://localhost/api/lightOff",
"statusUrl": "http://localhost/api/lightStatus",
"brightness": {
"setUrl": "http://localhost/api/setBrightness?brightness=%s",
"statusUrl": "http://localhost/api/getBrightness"
},
"colorTemperature": {
"setUrl": "http://localhost/api/setColorTemperature?temperature=%s",
"statusUrl": "http://localhost/api/getColorTemperature",
"unit": "mired"
}
}
{
"accessory": "HTTP-LIGHTBULB",
"name": "Light",
"debug": true,
"onUrl": {
"url": "http://localhost/api/light",
"method": "PUT",
"body": "{ \"on\": 1 }"
},
"offUrl": {
"url": "http://localhost/api/light",
"method": "PUT",
"body": "{ \"on\": 0 }"
},
"statusUrl": "http://localhost/api/light",
"brightness": {
"statusUrl": "http://localhost/api/light",
"setUrl": {
"url": "http://localhost/api/light",
"method": "PUT",
"body": "{ \"brightness\": %s }"
}
},
"colorTemperature": {
"statusUrl": "http://localhost/api/light",
"unit": "mired",
"minValue": 143,
"maxValue": 344,
"setUrl": {
"url": "http://localhost/api/light",
"method": "PUT",
"body": "{\"temperature\": %s }"
}
}
}
homebridge-http-lightbulb
can be used together withhomebridge-http-notification-server in order to receiveupdates when the state changes at your external program. For details on how to implement those updates and how toinstall and configure homebridge-http-notification-server
, please refer to theREADME of the repository first.
Down here is an example on how to configure homebridge-http-lightbulb
to work with your implementation of thehomebridge-http-notification-server
.
{
"accessories": [
{
"accessory": "HTTP-LIGHTBULB",
"name": "Light",
"notificationID": "my-switlightch",
"notificationPassword": "superSecretPassword",
"onUrl": "http://localhost/api/lightOn",
"offUrl": "http://localhost/api/lightOff",
"statusUrl": "http://localhost/api/lightStatus"
}
]
}
notificationID
is an per Homebridge instance unique id which must be included in any http request.notificationPassword
is optional. It can be used to secure any incoming requests.To get more details about the configuration have a look at theREADME.
Available characteristics (for the POST body)
Down here are all characteristics listed which can be updated with an request to the homebridge-http-notification-server
characteristic
"On": expects a boolean value
characteristic
"Brightness": expects a number value
in miredcharacteristic
"Hue": expects a number value
characteristic
"Saturation": expects a number value
characteristic
"ColorTemperature": expects a number value
TODOhomebridge-http-switch Plugin homebridge-http-switch is a Homebridge plugin with which you can configureHomeKit switches which forward any requests to a defined http server. This comes in handy when y
Homebridge HTTP TV Plugin A Homebridge plugin to let you control your TV (or a bridge server) using HTTP Features Exposes a HomeKit TV accessory Characteristics changes trigger HTTP requests to user-d
homebridge-http-humidity-sensor This Homebridge plugin can be used integrate your humidity sensor which has ahttp api into HomeKit. Installation First of all you need to have Homebridge installed. Ref
homebridge-http-temperature-sensor Plugin This Homebridge plugin can be used integrate your temperature sensor which has ahttp api into HomeKit. Installation First of all you need to have Homebridge i
homebridge-http-rgb-push Homebridge plugin to control a HTTP-based RGB device. Supports RGB HTTP(S) devices on the HomeBridge Platform and provides a readablecallback for getting and setting the follo
homebridge-http-rgb-bulb Supports HTTP/HTTPS devices on Homebridge Platform. This plugin requires/uses a simple interface with the enpoint (only a set color URI and a get color URI). I decided to crea