You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 8 Next »

Overview

Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API (Docker Image). It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of "smart home" devices.


Build Custom Homebridge Image

> docker build -t jmehan/homebridge .

Dockerfile
FROM oznu/homebridge

RUN npm install -g homebridge-nest
RUN npm install -g homebridge-sonoff-tasmota-http
RUN npm install -g homebridge-sonos
RUN npm install -g homebridge-http-temperature
RUN npm install -g homebridge-mqttthing
RUN npm install -g homebridge-cmd4
RUN mkdir ~/.homebridge
RUN mkdir ~/.homebridge/Cmd4Scripts
RUN cp /usr/local/lib/node_modules/homebridge-cmd4/Extras/Cmd4Scripts/State.js ~/.homebridge/Cmd4Scripts
RUN chmod 700 ~/.homebridge/Cmd4Scripts/State.js
RUN npm install -g homebridge-http-webhooks


Running our Container

docker run -d \
--restart=always \
--name homebridge \
--net host \
-e HOMEBRIDGE_INSECURE=1 \
-e HOMEBRIDGE_CONFIG_UI=1 \
-e HOMEBRIDGE_CONFIG_UI_PORT=8089 \
-p 8089:8089 \
-p 51826:51826 \
-p 51828:51828 \
-v /share/Volume/CONTAINERS/homebridge/conf:/homebridge \
-v /share/Volume/CONTAINERS/homebridge/plugins:/homebridge/plugins \
jmehan/homebridge


Our Configuration

{
    "bridge": {
        "name": "Homebridge",
        "username": "XX:XX:XX:XX:XX:XX",
        "port": 51826,
        "pin": "XXX-XX-XXX"
    },

    "description": "This is an example configuration file",

    "accessories": [
        {
                "accessory": "SonoffTasmotaHTTP",
                "name": "sonoff151",
                "hostname": "192.168.1.151",
                "user": "admin",
                "password": "XXX"
        },
        {
                "accessory": "HttpTemperature",
                "name": "Spa Temperature",
                "url": "http://192.168.1.82/info/",
                "max_temp": 200,
                "http_method": "GET",
                "field_name": "temperature",
                "update_interval": "60000",
                "units": "C"

        },
		{
                "accessory": "Sonos",
                "name": "Katie's Speaker",
                "room": "Katie's Room",
                "mute": false
        },
		{
                "accessory": "mqttthing",
                "type": "lightbulb",
                "name": "teamroom",
                "url": "http://XXXX:1883",
                "topics":
                {
                        "getOn":                "ikea",
                        "setOn":                "ikea"
                },
                "onValue": "on",
                "offValue": "off"
        }


    ],

    "platforms": [
        {
                "platform": "Nest",
                "clientId": "XXX",
                "token":"XXXX",
                "clientSecret": "XXX",
                "code": "XXX"
        },
		{
                "platform": "Cmd4",
                "name": "Cmd4",
                "accessories":
                [
                        {
                        "type": "TemperatureSensor",
                        "name": "sonoff158",
                        "timeout": 3000,
                        "polling": false,
                        "interval": 100,
                        "stateChangeResponseTime": 10,
                        "state_cmd": "sh /homebridge/Cmd4Scripts/sonoff158.sh"
                        }
                ]
        },
        {
                        "platform": "HttpWebHooks",
                        "webhook_port": "51828",
                        "cache_directory": "/homebridge/.node-persist/storage",
                        "sensors": [
                        ]
        }
    ]
}


What does this give us?

  • Homebridge running on port 51826
  • Homebridge UI listening on port 8089
  • homebridge-http-webhooks listening on port 51828


NGINX Integration

In order to access the homebridge ui via an nginx reverse proxy, you will need a configuration like the following:

server {
        server_name  homebridge homebridge.jmehan.com;
        location / {
            proxy_pass         http://192.168.1.60:8089/;
            proxy_http_version          1.1;
            proxy_buffering             off;
            proxy_set_header            Host $host;
            proxy_set_header            Upgrade $http_upgrade;
            proxy_set_header            Connection "Upgrade";
            proxy_set_header            X-Real-IP $remote_addr;
            proxy_set_header            X-Forward-For $proxy_add_x_forwarded_for;
        }
}


Plugins

We can see what plugins are available for homebridge from the following url:

https://www.npmjs.com/search?q=homebridge-plugin

SonoffTasmotaHTTP Plugin

config.json
{
                "accessory": "SonoffTasmotaHTTP",
                "name": "sonoff97-1",
                "hostname": "192.168.1.97",
                "relay": "1",
                "user": "xxx",
                "password": "xxx"
},
{
 
                "accessory": "SonoffTasmotaHTTP",
                "name": "sonoff98",
                "hostname": "192.168.1.98",
                "user": "xxx",
                "password": "xxx"
},
...

Sonoff-Tasmota Mqtt Plugin

config.json
...
{
                "accessory": "mqtt-switch-tasmota",
                "name": "sonoff97-2-relay",
                "url": "mqtt://192.168.1.60",
                "username": "john",
                "password": "pass",
                "topics": {
                        "statusGet": "stat/sonoff97-2/POWER",
                        "statusSet": "cmnd/sonoff97-2/POWER"
                }
},
...

Cmd4 Plugin


sonoff158.sh
#TEMP on SONOFF 158
SOURCE_URL="http://192.168.1.158/cm?user=admin&password=xxx&cmnd=status%2010"
 
if [ "$1" = "Get" ]; then
   # $2 would be the name 'sonoff158'
   # $3 would be the charactersistic
 
   if [ "$3" = "CurrentTemperature" ]; then
        temp=`curl -L $SOURCE_URL |sed -rn 's/.*"Temperature":([0-9]*.[0-9]*).*/\1/p'`
        echo $temp
      exit 0
   fi
 
   if [ "$3" = "StatusActive" ]; then
      echo "1"
      exit 0
   fi
fi
 
if [ "$1" = "Set" ]; then
  exit 1
fi
exit 0


References

  • No labels