Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

how to use custom characteristics? #2

Open
tvillingett opened this issue Aug 29, 2016 · 20 comments
Open

how to use custom characteristics? #2

tvillingett opened this issue Aug 29, 2016 · 20 comments

Comments

@tvillingett
Copy link

How can i set custom characteristics from node-red, for example the type that Eve has for power consumption?

(see example here on row 38, for the UUID that the Eve App recognises):
https://github.com/Samfox2/homebridge-domotiga/blob/3319c01317a8b0e55af821869cdd81d19e3478d1/index.js

@cflurin
Copy link
Owner

cflurin commented Aug 30, 2016

The actual version doesn't support custom characteristics. It's on the todo list.

@ethan-phu
Copy link

how can i use the topic just like [homebridge/to/set],to set an TemperatureSensor of value's ?

@ghost
Copy link

ghost commented Apr 17, 2017

+1

Let me explain:

I like to switch from several device plug-ins (Sony-Bravia tv, Yamaha amp) to mqtt and a python deamon. As with the device plugins the "string" chacateristic holds the name of the input like "HDMI1" or the name of the tv channel "NGC HD".

Within HomeKit (EVE does work with those, like some other apps, apples "home" does not) I can create scenes with the name "National Geographic" where I need to set the amp input characteristic to "Audio1" and the tv channel characteristic to the appropriate URI given by the TV.

Tinkering with the device plugins I was able to do this by creating a "STRING" type characteristic, where the props are set to READ/WRITE/NOTIFY.
if the channel is changed by the TV'S remote, the status is reflected in HomeKit on all devices but only If I use my own solution using my deamon/mqtt. And basically use homebridge as a connection to homekit/Siri without any of the plugins.

I have looked into the sources of homebridge-Mqtt. And as far as I can see the "STRING" values are dropped, which could be a quick fix. I am not really a nodesjs fan nor expert as 99% of my dev work is python related, the whole concept of prototypes confuses me a bit. Dealing with props of a characteristic seems in order except for the interface to the HB-Mqtt API.

As for now, hb-Mqtt seems to support all default types, defined in the hab layer.
If as a workaround I need to add my own services and characteristics in that file, that would be fine, except for it being in the wrong place (updates, new installations). To me HomeKit is fairly "open" in the sense of allowing custom services to be added although within certain rules. This plugin removes that capability. Like you said: it is on the todo list (and for that reason I guess).

I might be able to contribute, but with a lot of overhead (digging into the inner workings of this plugin and stuff like GIT, never forked and contributed to a project). Without these options I get a bit stuck in continuing building what is needed.

Martijn

@ghost
Copy link

ghost commented Apr 18, 2017

I have confirmed the adding of my own types in HomeKitTypes.js and that the handling of STRING characteristics is broken in the repo as we speak. More info in a new posted Issue, where I report on how to create custom services and characteristics and found out that STRING support is an easy fix.

I am seriously considering implementing custom charactereristics an services to the mqtt API.
With that covered it is easy to implement an accessory based on say a esp8266, or arduino (with Ethernet shield) and it can automagically add itself to homebridge!

There seem two things which needs to be done:
1: Handle a payload Json to create a characteristic, setting name, type and props and Params.
2: Handle a payload json to create a service, setting name, characteristics and optional characteristics.

Topic homebridge/to/characteristic
{
name : "Source",
props : {format : "STRING", perms : [READ,WRITE,NOTIFY]}, //minValue, maxValue, minStep
UUID : "00000-00000-00000.....". // or generate in homebridge-mqtt ?
}

Likewise for defining a service.

Afterwards, the service instance can be made like any other. Additional management (remove/list) might be useful, not sure yet.

Any comments or tips might come in handy. Most of the code seems already there I guess just some additional glue seems needed.

Helmsman

@cflurin
Copy link
Owner

cflurin commented Apr 18, 2017

The string issue should be fixed with the new version.
Regarding adding characteristics and services I've to analyse the homebridge/hap code.
One approach would be to put the custom characteristics and services in a separate file (persistent) and add them to homebridge at init.

@cflurin
Copy link
Owner

cflurin commented Apr 19, 2017

A solution with a separate file:

  1. build a file HomeKitTypes-Custom.js with your custom characteristics and services e.g.:
var inherits = require('util').inherits;
var Characteristic = require('../Characteristic').Characteristic;
var Service = require('../Service').Service;


/**
  * Characteristic "Current Air Pressure"
  */

Characteristic.CurrentAirPressure = function() {
  Characteristic.call(this, 'CurrentAirPressure', '00000102-0000-1000-8000-0026BB765291');
  this.setProps({
    format: Characteristic.Formats.UINT16,
    perms: [Characteristic.Perms.READ, Characteristic.Perms.NOTIFY]
  });
  this.value = this.getDefaultValue();
};

inherits(Characteristic.CurrentAirPressure, Characteristic);

Characteristic.CurrentAirPressure.UUID = '00000102-0000-1000-8000-0026BB765291';

/**
 * Service "Air Pressure Sensor"
 */

Service.AirPressureSensor = function(displayName, subtype) {
  Service.call(this, displayName, '00000101-0000-1000-8000-0026BB765291', subtype);

  // Required Characteristics
  this.addCharacteristic(Characteristic.CurrentAirPressure);

  // Optional Characteristics
  this.addOptionalCharacteristic(Characteristic.Name);
};

inherits(Service.AirPressureSensor, Service);

Service.AirPressureSensor.UUID = '00000101-0000-1000-8000-0026BB765291';
  1. copy HomeKitTypes-Custom.js into the same hap-nodejs folder as HomeKitTypes.js
    (/usr/lib/node_modules/homebridge/node_modules/hap-nodejs/lib/gen)

  2. add this line a the end of HomeKitTypes.js

var HomeKitTypesCustom = require('./HomeKitTypes-Custom');
  1. restart homebridge

@cflurin
Copy link
Owner

cflurin commented Apr 19, 2017

... how to use:

add an accessory:

topic: homebridge/to/add
payload:
{
	"name": "netatmo",
	"service_name": "outdoor_temp",
	"service": "TemperatureSensor",
	"CurrentTemperature": {
		"minValue": -20,
		"maxValue": 60,
		"minStep": 1
	}
}

add the new service:

topic: homebridge/to/add/service
payload:
{
	"name": "netatmo",
	"service_name": "outdoor_pressure",
	"service": "AirPressureSensor"
}

set the value:

topic: hoembridge/to/set
payload:
{
	"name": "netatmo",
	"service_name": "outdoor_pressure",
	"characteristic": "CurrentAirPressure",
	"value": 1025
}

@ghost
Copy link

ghost commented Apr 19, 2017

This is indeed what I do, except that I patch the configs in the homekittypes.js
I think it is better to move the homekittypes-custom to say the .homebridge directory as I am not sure what updates will do in the future.

As it is now, this is not really a homebridge-mqtt issue, as we patch a required library of homebridge. In fact this something hap-node should allow. At the other end, many plugins do create characteristics and service at init of the plugin.. I need to dig into it a bit further somehow this must be tackled in a way that does not confuse people after upgrades etc.

There is tons of code to be read, so be patient please.

Helmsman

@ghost
Copy link

ghost commented Apr 21, 2017

I think I have found a solution on implementing custom characteristics and services. I might need Some help with forking this repo and putting the changes back. I have messed up something in git hub once majorly and never got a clue wat went wrong. First I must see if my theory actually works.

After I have a proof of concept, I will start some discussion about how to integrate this in the mqtt API.
The majority of the work will be some caching mechanism to recreate the custom characteristics and services at startup.

I'm committed to get this working, as said before It would be really cool and useful!

Helmsman

@CaptiveCreeper
Copy link

CaptiveCreeper commented Aug 2, 2017

Would cfluin's solution make it possible to have both a fan and a light under the same accessory? So i wouldn't have to add two separate accessories for the same hardware accessory. For example if I add the characteristics for a fan and a light in the same service when it gets exposed to homekit would it have a light and a fan control or would I have to do something else to accomplish this?

@ghost
Copy link

ghost commented Aug 9, 2017

I am slowly progressing mainly because I am not a Javascript/NodeJS fan nor expert.
I have added some routines to add new accessories and characteristics at runtime but I have no clue on how to test/debug them. Currently I'm in the mediterainian on a yacht.

@CaptiveCreeper: yes. In homekit a Accessory can have multiple characteristics this module supports that fully. If you scroll up, you can see a code example of how to Add a "Service" read that as "Accessory" and you probably have your question answered. I am adding some code to add the Service and Characteristics at runtime (probably over mqtt). This way an MQTT endpoint can configure itself for use with homebridge over MQTT via this plugin

@ihatemyisp
Copy link
Contributor

@helmsman35 Any progress on your method to add custom services/characteristics?

I'd go with the method @cflurin said, but I worry it'll break updating homebridge or would be overwritten upon updating homebridge.

@ghost
Copy link

ghost commented Nov 30, 2017 via email

@cflurin cflurin closed this as completed Dec 15, 2018
@bohtho
Copy link

bohtho commented Dec 1, 2019

I agree with the above; HomeKit of course supports custom characteristics and services, not just Home.app (yet).

Have things changed since this with regard to custom properties? @cflurin

@bohtho
Copy link

bohtho commented Dec 8, 2019

Nick Farina just now on how to implement custom characteristics homebridge/homebridge#1453 (comment)

@iangray001
Copy link

@bohtho No, he didn't. He seems to have confirmed @cflurin's method, reiterating that Homebridge doesn't seem to support accessory-defined characteristics.

@bohtho
Copy link

bohtho commented Dec 8, 2019

You are right of course. I got momentarily confused. That would of course also be “ahead of time” and not dynamic custom.

@nfarina
Copy link

nfarina commented Dec 9, 2019

So just to try and clarify a confusing situation - custom characteristics really aren't very magical. Characteristics are just UUIDs with a small "props" dictionary that defines the kind of value they accept and some other metadata. The only magic is that all the characteristics pre-defined in HomeKit.ts have UUIDs that are known by Apple.

But you can easily, and at any time, create new instances of the Characteristic class (or subclass it if you want, but it's just syntactic sugar) with your own randomly-generated UUID and props. There's nothing special about it.

If homebridge-mqtt wished to support this, it wouldn't be infeasible, is all I'm saying. You could collect UUIDs and props via your JSON API and pass them along to Homebridge.

@bakman2
Copy link

bakman2 commented Dec 14, 2019

@nfarina as far as I understand, only the "known" UUID's show up in the home app for anything else one needs to use an app that supports those ?

Looking at the netatmo plugin, it adds a noiselevel/dB icon to the home app, which is something custom but does shows up. How does this work ?

@nfarina
Copy link

nfarina commented Dec 15, 2019

So you can add all the "unknown" custom characteristics you want, and the main limitation is Siri won't know what to do with them. But you can still add them to Automations and Scenes and view their values directly in the Home app (if you know where to look).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants