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."
}
}
}
}
}

View File

@@ -0,0 +1,164 @@
{
"config": {
"step": {
"user": {
"title": "Подключение к Reticulum",
"description": "Home Assistant запустит экземпляр Reticulum и подключится к вашему стеку Reticulum по TCP (на соседней машине должен быть настроен TCPServerInterface).",
"data": {
"target_host": "Хост",
"target_port": "Порт",
"display_name": "Отображаемое имя",
"interface_name": "Название интерфейса"
},
"data_description": {
"target_host": "Имя хоста или IP-адрес машины с TCP-сервером Reticulum.",
"target_port": "TCP-порт TCPServerInterface Reticulum (по умолчанию 4242).",
"display_name": "Имя, анонсируемое другим узлам Reticulum для этого Home Assistant.",
"interface_name": "Метка соединения в конфигурации Reticulum."
}
}
},
"error": {
"cannot_connect": "Не удалось подключиться к TCP-серверу Reticulum по указанному адресу и порту."
},
"abort": {
"already_configured": "Reticulum уже настроен.",
"single_instance_allowed": "Допускается только один экземпляр Reticulum."
}
},
"options": {
"step": {
"init": {
"title": "Параметры Reticulum",
"data": {
"enable_assist": "Направлять входящие сообщения в Assist",
"assist_agent": "Агент Assist (id сущности/агента, пусто = по умолчанию)",
"assist_language": "Язык Assist (пусто = язык системы)",
"allow_all_senders": "Отвечать любому отправителю",
"allowed_identities": "Разрешённые адреса отправителей",
"default_recipient": "Адрес получателя по умолчанию (для сущности notify)",
"greeting": "Приветственное сообщение",
"delivery_method": "Способ доставки по умолчанию",
"announce_interval": "Интервал анонсов",
"propagation_node": "Адрес узла ретрансляции (propagation node)",
"sync_interval": "Интервал синхронизации с узлом ретрансляции",
"loglevel": "Уровень логирования Reticulum (0-7)"
},
"data_description": {
"enable_assist": "Если включено, входящие сообщения LXMF обрабатываются агентом Assist, а ответ отправляется обратно через Reticulum.",
"allowed_identities": "По одному адресу в строке (или через запятую). Используется только если «Отвечать любому отправителю» выключено.",
"default_recipient": "16-байтовый hex-адрес LXMF, на который отправляет сущность notify.reticulum.",
"announce_interval": "Как часто (в секундах) анонсировать наш адрес. 0 отключает периодические анонсы.",
"propagation_node": "Необязательный узел ретрансляции LXMF для доставки по принципу store-and-forward.",
"sync_interval": "Как часто (в секундах) забирать сообщения из очереди узла ретрансляции. 0 отключает."
}
}
}
},
"entity": {
"sensor": {
"lxmf_address": { "name": "Адрес LXMF" },
"messages_received": { "name": "Сообщений получено" },
"messages_sent": { "name": "Сообщений отправлено" },
"messages_failed": { "name": "Сообщений не доставлено" },
"peers": { "name": "Известные узлы" },
"last_message": { "name": "Последнее сообщение" },
"last_message_time": { "name": "Время последнего сообщения" },
"rx_bytes": { "name": "Принято" },
"tx_bytes": { "name": "Передано" },
"bitrate": { "name": "Битрейт" },
"rssi": { "name": "RSSI" },
"snr": { "name": "SNR" },
"link_quality": { "name": "Качество канала" }
},
"binary_sensor": {
"connected": { "name": "Подключено" }
},
"button": {
"announce": { "name": "Анонсировать" },
"sync": { "name": "Синхронизировать узел ретрансляции" }
},
"notify": {
"message": { "name": "Сообщение" }
}
},
"selector": {
"delivery_method": {
"options": {
"direct": "Прямая (установить канал)",
"opportunistic": "Оппортунистическая (один пакет)",
"propagated": "Через ретрансляцию (store-and-forward)"
}
}
},
"device_automation": {
"trigger_type": {
"message_received": "Получено сообщение",
"message_delivered": "Сообщение доставлено",
"message_failed": "Сбой доставки сообщения",
"announce_received": "Получен анонс (услышан узел)"
}
},
"services": {
"send_message": {
"name": "Отправить сообщение",
"description": "Отправить сообщение LXMF узлу Reticulum.",
"fields": {
"destination": {
"name": "Получатель",
"description": "16-байтовый hex-хэш адреса LXMF получателя."
},
"content": {
"name": "Текст",
"description": "Тело сообщения."
},
"title": {
"name": "Заголовок",
"description": "Необязательный заголовок/тема сообщения."
},
"method": {
"name": "Способ",
"description": "Используемый способ доставки."
},
"fields": {
"name": "Поля",
"description": "Необязательный словарь расширенных полей LXMF."
}
}
},
"announce": {
"name": "Анонсировать",
"description": "Анонсировать адрес LXMF этого Home Assistant в сети."
},
"request_path": {
"name": "Запросить маршрут",
"description": "Запросить у сети маршрут до узла.",
"fields": {
"destination": {
"name": "Получатель",
"description": "Хэш адреса, до которого нужно найти маршрут."
}
}
},
"set_propagation_node": {
"name": "Задать узел ретрансляции",
"description": "Задать исходящий узел ретрансляции LXMF.",
"fields": {
"destination": {
"name": "Получатель",
"description": "Хэш адреса узла ретрансляции."
}
}
},
"sync_propagation": {
"name": "Синхронизировать узел ретрансляции",
"description": "Забрать сообщения из очереди настроенного узла ретрансляции.",
"fields": {
"max_messages": {
"name": "Макс. сообщений",
"description": "Максимальное число сообщений для получения."
}
}
}
}
}