Add Reticulum/LXMF integration for Home Assistant

Custom integration connecting Home Assistant to a Reticulum network over a
TCPClientInterface and exchanging LXMF messages, with an Assist conversation
bridge, notify entity, sensors (incl. interface telemetry), buttons, services,
bus events and device triggers.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
claude
2026-07-22 18:08:12 +03:00
parent 22408c2bd5
commit b40c527515
19 changed files with 2727 additions and 1 deletions

View File

@@ -0,0 +1,164 @@
{
"config": {
"step": {
"user": {
"title": "Connect to Reticulum",
"description": "Home Assistant will run a Reticulum instance and connect out to your Reticulum stack over TCP (the neighbouring machine must expose a TCPServerInterface).",
"data": {
"target_host": "Target host",
"target_port": "Target port",
"display_name": "Display name",
"interface_name": "Interface name"
},
"data_description": {
"target_host": "Hostname or IP of the machine running the Reticulum TCP server.",
"target_port": "TCP port of the Reticulum TCPServerInterface (default 4242).",
"display_name": "Name announced to other Reticulum peers for this Home Assistant.",
"interface_name": "Label used for this connection in the Reticulum config."
}
}
},
"error": {
"cannot_connect": "Could not reach the Reticulum TCP server at that host and port."
},
"abort": {
"already_configured": "Reticulum is already configured.",
"single_instance_allowed": "Only a single Reticulum instance is allowed."
}
},
"options": {
"step": {
"init": {
"title": "Reticulum options",
"data": {
"enable_assist": "Route incoming messages to Assist",
"assist_agent": "Assist agent (entity id / agent id, blank = default)",
"assist_language": "Assist language (blank = system default)",
"allow_all_senders": "Reply to any sender",
"allowed_identities": "Allowed sender addresses",
"default_recipient": "Default recipient address (for the notify entity)",
"greeting": "Greeting message",
"delivery_method": "Default delivery method",
"announce_interval": "Announce interval",
"propagation_node": "Propagation node address",
"sync_interval": "Propagation sync interval",
"loglevel": "Reticulum log level (0-7)"
},
"data_description": {
"enable_assist": "When enabled, incoming LXMF messages are answered by the Assist conversation agent and the reply is sent back over Reticulum.",
"allowed_identities": "One address per line (or comma separated). Only used when 'Reply to any sender' is off.",
"default_recipient": "16-byte hex LXMF address that the notify.reticulum entity sends to.",
"announce_interval": "How often (seconds) to announce our address. 0 disables periodic announces.",
"propagation_node": "Optional LXMF propagation node for store-and-forward delivery.",
"sync_interval": "How often (seconds) to pull queued messages from the propagation node. 0 disables."
}
}
}
},
"entity": {
"sensor": {
"lxmf_address": { "name": "LXMF address" },
"messages_received": { "name": "Messages received" },
"messages_sent": { "name": "Messages sent" },
"messages_failed": { "name": "Messages failed" },
"peers": { "name": "Known peers" },
"last_message": { "name": "Last message" },
"last_message_time": { "name": "Last message time" },
"rx_bytes": { "name": "Received" },
"tx_bytes": { "name": "Transmitted" },
"bitrate": { "name": "Bitrate" },
"rssi": { "name": "RSSI" },
"snr": { "name": "SNR" },
"link_quality": { "name": "Link quality" }
},
"binary_sensor": {
"connected": { "name": "Connected" }
},
"button": {
"announce": { "name": "Announce" },
"sync": { "name": "Sync propagation node" }
},
"notify": {
"message": { "name": "Message" }
}
},
"selector": {
"delivery_method": {
"options": {
"direct": "Direct (establish a link)",
"opportunistic": "Opportunistic (single packet)",
"propagated": "Propagated (store and forward)"
}
}
},
"device_automation": {
"trigger_type": {
"message_received": "Message received",
"message_delivered": "Message delivered",
"message_failed": "Message delivery failed",
"announce_received": "Announce received (peer heard)"
}
},
"services": {
"send_message": {
"name": "Send message",
"description": "Send an LXMF message to a Reticulum destination.",
"fields": {
"destination": {
"name": "Destination",
"description": "16-byte hex LXMF destination hash of the recipient."
},
"content": {
"name": "Content",
"description": "The message body."
},
"title": {
"name": "Title",
"description": "Optional message title / subject."
},
"method": {
"name": "Method",
"description": "Delivery method to use."
},
"fields": {
"name": "Fields",
"description": "Optional advanced LXMF fields dictionary."
}
}
},
"announce": {
"name": "Announce",
"description": "Announce this Home Assistant's LXMF destination on the network."
},
"request_path": {
"name": "Request path",
"description": "Ask the network for a path to a destination.",
"fields": {
"destination": {
"name": "Destination",
"description": "Destination hash to resolve a path to."
}
}
},
"set_propagation_node": {
"name": "Set propagation node",
"description": "Set the outbound LXMF propagation node.",
"fields": {
"destination": {
"name": "Destination",
"description": "Propagation node destination hash."
}
}
},
"sync_propagation": {
"name": "Sync propagation node",
"description": "Pull queued messages from the configured propagation node.",
"fields": {
"max_messages": {
"name": "Max messages",
"description": "Maximum number of messages to retrieve."
}
}
}
}
}