Background: I used Tailscale for remote access to HA. It mostly worked well, but in the driveway the phone is half on cellular, half on wifi. The HA app keeps an old connection and hangs most of the time when I just quickly want to open the garage door. Kill, reopen, wait. That was annoying enough that I wrote something that fixes that over the weekend.

ha-iroh is a small Android app plus a HACS integration, built on iroh (p2p QUIC). Every phone has a keypair with HA, traffic is end-to-end encrypted, NAT hole punching is done automatically where possible, otherwise a relay is used that only sees ciphertext. Setup (one-time, first connection) is done by scanning a QR-Code.

There is no persistent tunnel. The app dials HA when you tap something and disconnects afterwards, so network switches don’t matter and my in-front-of-the-garage-door wait is gone.

Features

  • Device Controls in the Android power menu / quick settings: lights, switches, fans, climate, covers, locks, scenes, scripts, buttons, with live state
  • Assist via quick settings tile or launcher shortcut (text only for now)
  • the normal HA dashboard in a WebView, login once, any auth provider incl. MFA
  • several HA instances in one app
  • pairing by QR code from the HA config flow. Delete the device in HA and the phone is out

Not included, on purpose Sensors, location, notifications, widgets, Wear OS, iOS. I still use the official app for all of that. ha-iroh only covers quick control when I’m not home.

Status

  • v0.2.x. I’ve not received any major bug reports yet, but DO expect rough edges. For me at least it currently works reliably enough.
  • Android 12+, arm64 APK via GitHub Releases or Obtainium. Not on Play.
  • HA 2026.3+, HACS custom repo. The integration starts a small Rust bridge as a subprocess, x86_64 and aarch64 bundled, so HA OS / Container / Supervised work.
  • Optional: forward one UDP port and iroh connects directly always instead of sometimes via relay. Not required.
  • Two HA settings to check, both in the README: ip_ban_enabled (the bridge connects from localhost, so wrong passwords from one phone can ban 127.0.0.1, i.e. all phones) and never put loopback into trusted_networks.

Disclosure

Large parts of this were built with an LLM. If that’s a dealbreaker for you, this project is not for you.

Links

Bug reports welcome, especially from people behind CGNAT or on Fritz!Box / MikroTik.

  • Midnight Wolf@lemmy.world
    link
    fedilink
    English
    arrow-up
    2
    arrow-down
    2
    ·
    edit-2
    7 days ago

    Physical button: 1 action, no logic

    Software button: infinite actions, complete logic over everything in HA

    It’s like ‘why should I use HA, the light switch is right there’ yes technically but you’re missing the whole point. Why should you go on trips and see the sights of other places, Google Street View is right there.

    E: real world example, though my network reaches far beyond my driveway so no button required:

    Automation
    alias: Midnight - Travel, Arriving Home
    description: ''
    triggers:
      - trigger: zone
        entity_id: person.midnight
        zone: zone.home
        event: enter
    conditions:
      - condition: state
        entity_id: input_boolean.midnight_awake
        state:
          - 'on'
      - condition: time
        after: '10:00:00'
    actions:
      - if:
          - condition: not
            conditions:
              - alias: Connected to home wifi network
                condition: state
                entity_id: sensor.midnights_phone_wi_fi_connection
                state:
                  - input_text.home_network
        then:
          - wait_for_trigger:
              - trigger: state
                entity_id:
                  - sensor.midnights_phone_wi_fi_connection
                to:
                  - input_text.home_network
            timeout:
              hours: 0
              minutes: 1
              seconds: 0
              milliseconds: 0
            continue_on_timeout: true
      - if:
          - condition: state
            entity_id: light.midnight_s_bedroom
            state:
              - 'off'
        then:
          - action: light.turn_on
            metadata: {}
            target:
              entity_id: light.midnight_s_bedroom
            data:
              brightness_pct: 35
          - action: input_boolean.turn_on
            target:
              entity_id: input_boolean.midnight_s_light_override
            data: {}
          - if:
              - condition: numeric_state
                entity_id: light.midnight_s_bedroom
                attribute: brightness
                below: 35
            then:
              - action: light.turn_on
                metadata: {}
                target:
                  entity_id: light.midnight_s_bedroom
                data:
                  brightness_pct: 35
      - delay:
          hours: 0
          minutes: 0
          seconds: 15
          milliseconds: 0
        enabled: true
      - action: automation.trigger
        metadata: {}
        target:
          entity_id:
            - automation.battery_low
            - automation.midnight_s_bedroom_midnight_s_thermostat_outside_is_cooler
            - automation.midnight_s_bedroom_midnight_s_thermostat_outside_is_warmer
        data:
          skip_condition: false
      - action: tts.speak
        metadata: {}
        target:
          entity_id: tts.piper
        data:
          cache: false
          media_player_entity_id: media_player.midnight_s_bedroom_home_assistant_voice_media_player
          message: Welcome home, Midnight!
    mode: single
    
    • WhyJiffie@sh.itjust.works
      link
      fedilink
      English
      arrow-up
      1
      ·
      6 days ago

      the physical button on the visor is much easier to press than unlocking your phone, finding the app, finding the right page, clicking the button, and checking if you pressed at the right place because it’s not tactile. you press the normal button out of reflex and you immediately know it worked.

      if you want to automate by that, do a trigger by door opening and time of day or whatever

    • mnemonicmonkeys@sh.itjust.works
      link
      fedilink
      English
      arrow-up
      1
      arrow-down
      1
      ·
      7 days ago

      Why should you go on trips and see the sights of other places, Google Street View is right there.

      This is a terrible argument because it’s the exact opposite of what you’re trying to push. OP’s spending all this time trying to optimize a garage door opener and it’s not working, while they could have just gotten a basic button set up in 5 minutes and be done with it, giving them more time to do something they actually enjoy.

      Home automation is supposed to save you time and make your life easier. Spending a bunch of time programming your house to greet you so you can cosplay as Tony Stark isn’t that.

      Maybe you don’t care and you find enjoyment in the tinkering on it’s own. That’s valid, but don’t get all defensive when other people don’t value the same things.

      OP is getting frustrated about an issue they’re having with home automation that’s easily bypassed with less tech. If they want to keep tinkering that’s their right. But maybe they were considering cutting their losses already and wanted validation. Maybe they got caught up with automating everything that they never considered not automating everything. I don’t know, I’m not psychic. But they can step back and make a conscious decision as to whether they keep going

      • Midnight Wolf@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        arrow-down
        2
        ·
        6 days ago

        …it’s supposed to be a bad (sarcastic) argument, for the reader to see that it is bad and reflect on the rest of the argument, followed by a light-bulb moment.

        crickets

        But I digress. I stopped reading after you called me defensive - you asked a question, I gave you an answer. That you don’t like the answer is your problem. Lead a horse to water but can’t make it drink…

        • mnemonicmonkeys@sh.itjust.works
          link
          fedilink
          English
          arrow-up
          2
          ·
          6 days ago

          …it’s supposed to be a bad (sarcastic) argument

          Sure it is. It’s totally not a Schrödinger’s Asshole /s

          Also, I asked OP a question, not you.