Nerves Home Assistant integration

I’ve had the idea to integrate Nerves devices into Home Assistant. The idea would be to communicate with Home Assistant which autodiscovers new devices and creates entities in Home Assistant to get all the wonderful features like a nice UI, historical data, automations, backup, interop with other devices and more for free.

My vision is to make device smart and integrate them easily into Home Assistant.

Some pseudo code could look like this:

defmodule MyNervesProject do
  use HomeAssistantNerves

  entity :sensor, :temperature do
    name "Living Room Temperature"
    unit_of_measurement "°C"
    device_class :temperature
    state_class :measurement
    
    state_fn fn -> 
      {:ok, temp} = YourTempSensor.read()
      temp
    end
    
    update_interval 60_000
  end
  
  entity :switch, :relay do
    name "Garage Light"
    
    state_fn fn -> 
      GPIO.read(pin)
    end
    
    on_command fn state -> 
      GPIO.write(pin, state)
    end
  end
end

This could be a nice use case for Build a Weather Station with Elixir and Nerves (PragProg)

But i’m still not a 100% sure on how to implement the communication layer between Nerves and Homeassistant. I see three options:

  1. MQTT
    Homeassistant offers a automatic device discovery with MQTT. This is very nice, because we wouldn’t have to create a custom integration and using native mechanics. The downside would be, that the user has to configure MQTT and run a broker (which should be already pretty common in a smart home but still)

  2. Native API
    Another option would be to directly hook in to the native APIs from Home Asssistant. This would had the same benefit of not writing a custom integration and also not having to use a MQTT broker but we would have to maintain the calls to the REST API (entity creation) and WebSocket API (realtime updates)

  3. Custom Integration
    This would be the most complex solution but also the most flexible. We could decide ourselves on how to communicate with the device (SSH, gRPC, WebSocket, TCP, HTTP) and implement Nerves only functionality into Home Assistant if there is a need for it. This would involve writing a custom integration in Home Assistant (which i’ve done for other devices, e.g. GitHub - kevinschweikert/ha-mahlkoenig: A homeassistant integration for the Mahlkönig X54 coffee grinder) which acts as a translation layer.

  4. Any other ideas?

Before starting this adventure, is there anything you would wish for? Any ideas for improvements? Is there a need/interest in the community?

I’ve looked at other topics but they wanted to write a standalone smart home solution or just connect to the existing information in Home Assistant

4 Likes

Could Home Assistant be fully managed within the Nerves runtime with Pythonx?

Possibly if it can run as a single python instance. I think HA typically wants more. But that seems very separate from what Kevin wants to achieve. If it is something you are interested in exploring I’d love a separate topic for that :slight_smile: how I understand what you are saying is that you are talking about running HA itself from Nerves. Which is interesting but different from making a Nerves device integrate with HA.

*intermission *Home Assistant with High Availability is hilarious. One could say it is HA HA.

Moving on.

@kevinschweikert I guess the HA API and WebSocket are the most straightforward and capable for integrating really well. Also doesn’t need extra stuff.

This would be a neat thing to toolup. HA API and some nice config or DSL to declare how the device shows up.

2 Likes