Design Principles

The following is a list of principles that drive the software design decisions to be made along the project. These are made to justify pull requests criteria, but also to serve as a guide to choose between different solutions / implementations through the design process.

1. API Simplicity

Minimum time to working prototypes

The number of primitives in Smart Home automation is rather low. The number of use cases is rather not – but can build upon a very clear and simple interface. Normally an Accessory will only have to offer the following interfaces:

2. High definition

Since the requirements should be simple, those should not be ambiguous.

We should not make an extra effort to offer several ways of achieving the same thing. A good example is that we should not offer an RGB color interface for bulbs because there we can’t guess the saturation, hue and brightness as different entities. We should offer then only ONE interface that is clear, and teach the user how to change from one scheme to the other. This might not be true as of now, but is a goal, as of design principle.

3. Backwards compatible

Easy maintenance, don’t harm the existing community

Firstly, we are on an early stage of this specification, so additions should not erase or work against current contributors codebases. Once we have kind of a stablished way of doing things with clear problems to solve, then a working 1.x.x should be prepared with a stablished breaking changes agenda. Clients then can learn how to differentiate pre and post 1.x.x versions and adapt to different accessories.

This is also general to software development: you should avoid too much abstraction and reuse of code because you create unintentional dependencies. APIs should be always stable and not change often. And when they do, they should respect existing codebases and previous design to avoid breaking existing apps.

4. Ecosystem compliance

Adoption is a goal

There is already an ecosystem that exist, with many manufacturers working and selling things, that other developers adapt and use. There is no point in reinventing the wheel (discovery protocols, data encoding, pairing practices etc) when we are not solving a specific problem; Only then reinventing the wheel can be justified.

That is why the aim of Bigfoot is offering a clear API to enable your products to work with future software clients, using existing protocols and libraries.