Dulus
An AI agent for your desktop and terminal, on any model you choose. Hosted models run on Fuel, paid in $DULUS.
翻訳待ち
No updates detected yet. GitHub releases will appear here.
Command bot for MeshCore mesh channels: weather, warnings, SOTA and repeaters in one short message each, with hard airtime limits
翻訳待ち
Loading the full README.
Read the full README ↗Listens on a MeshCore channel, recognises commands with a ! prefix, fetches data
from the outside world and answers in a single short message.
Channel: #at-ktn-bot, slot 3 on the node.
The bot does not attach to the radio. It attaches to the MQTT broker of the existing meshinfra stack, so it is not another TCP client on the node — a companion only tolerates two of those.
The bot answers in German: it serves a Carinthian radio network, and that is the language on the channel. This README is English so the design is readable to anyone; the code comments and the wiki stay German.
Airtime is the scarcest resource on the network. Everything else follows from it:
tx/chan), not
around it — that gate's own brakes apply on toplimit answers back to back, then one every
window/limit seconds. Globally 12 at once, then one every 50 s; per sender 4 at
once, then one every 75 sThe character limit is not the whole story. The node prefixes its own name
(AT-VI-KFHQ: ), and those characters count towards the firmware limit even though
the bot never sees them. SENDER_RESERVE (24) keeps room for them; without it the
node rejects the finished message with error_code 2 and the answer vanishes without
a trace. The bot's usable budget is MAX_MSG_LEN - SENDER_RESERVE.
| Command | Alias | Answer |
|---|---|---|
!wx <place|lat lon> | !wetter | WX Villach: 31.8C, 32%, Wind 12km/h W, 956hPa |
!wx <place abroad> | WX Lienz (AT): 21.9C, 77%, Wind 1km/h NNO (Modell) | |
!gipfel <summit> | !berg | WX Triglav 2864m: 9.0C, 79%, Wind 7km/h WNW (Modell) |
!warn [place|lat lon] | !warnung | WARN Waidegg (Kirchbach): GELB Gewitter (bis 22:00) |
!vorhersage <place> | !morgen, !fc | 24h Villach: 18 bis 26C, 11mm Regen, Boeen 38km/h |
!lawine | !avalanche | Lawine KTN: Stufe 3 erheblich (ab Waldgrenze) |
!sota <ref> | !summit | OE/KT-048 Rinsennock 2334m, 10Pkt |
!sota <lat> <lon> | OE/KT-072 Villacher Alpe 2166m 8Pkt (88m NW) | … | |
!az <lat lon> | !zone | AZ OE/KT-048 Rinsennock 2334m: JA - 30m bis zum Rand, 10Pkt |
!spot [assoc] | !spots | OE8XXX OE/KT-048 14.062 CW 12min |
!sonne [place|lat lon] | !sun | Sonne: auf 06:04, unter 20:15, dunkel 20:48 (noch 1h03) |
!mond [place|lat lon] | !moon | Mond: auf 10:28, unter 21:33, zunehmend 17% |
!events | !event, !termine | Event: Mesh-Treffen, Villach - 14.11. 10:00 (in 29 Tagen) |
!sicht <lat,lon> <lat,lon> | !los | Sicht 18.4km: FREI, Fresnel 100% (enger bei km17.5, 1347m) |
!hoehe <lat,lon> |
Without a place, !wx and !relais use the default location from the configuration.
Typos are tolerated (!wx vilach finds Villach) — and flagged, see below.
A missing argument produces the usage line, not silence. Someone who typed a
command correctly and merely forgot an argument has not produced garbage. The airtime
is better spent on !sicht <lat,lon> <lat,lon> - z.B. !sicht 46.60,13.67 46.79,14.96
than on a second round of guessing. An unknown command still gets silence.
An answer on the channel floods: channel messages carry no stored path, so every one of the 35 Carinthian repeaters transmits it once. A question and its answer together cost roughly 70 transmissions. Half of that is ours.
A direct message travels a known path and only burdens the repeaters on that chain:
| transmissions | |
|---|---|
| today, on the channel | ~70 per exchange |
| direct message, path known, 2 hops | ~8 |
| first DM to a new contact | as today — the path lookup floods |
So the bot answers on the medium it was asked on. Write on #at-ktn-bot and
the answer appears there, where everyone reads along and one !wx villach
serves five people. Write directly and the network is spared the flood.
It cannot start a direct message. A channel message carries no sender identity at all — only a name in the text, which is neither a key nor trustworthy. Only somebody who wrote directly first can be answered directly. That also makes the per-sender limit meaningful there: a channel name can be changed to dodge it, a public key cannot.
This is the beginning of the README. Read the rest at the original. Read the full README ↗
!seehoehe |
Hoehe 46.6719,13.8902: 1478m (EU-DEM 25m) |
!dist <lat,lon> <lat,lon> | !entfernung | 37.9km, Peilung 312 NW (zurueck 132 SO) |
!qth <locator|lat lon> | !loc | Maidenhead to coordinates and back |
!netz | !status | Netz KTN: 29/33 aktiv, Pakete 2578/1h, top WO-Poelling |
!wo <name|hash> | !node, !pfad | Position, traffic and last contact of a node |
!relais <band> [place|lat lon] | !rpt | 2m b. Villach: OE8XNK Gerlitzen 145.7625 -0.6 (10km) | … |
!melde <what, where> | !luecke | Record a field report, position optional |
!dx | !solar | DX: SFI 117, A6, K0, SN 83, Xray C1.3 |
!iss [lat lon] | !sat | ISS 05:44 max 24Grad, NNO>W, 6min |
!zeit | !time, !utc | UTC 16.08.2026 17:11:53 (Epoch 1786900313) |
!quota | !kontingent, !rest | Kontingent: 44/50 pro 1h00 frei. Bot 12/12 pro 10min |
!ping | MeshBot OK, up 3d4h, 42 cmds |
!frag <question> | !frage, !ask, !ki | KI: Ein Repeater verstärkt und weiterleitet Signale im Funknetz. |
!version | !ver, !stand | MeshBot 1.10.2: !frag: gepflegte Wissens-Antworten ohne Modell |
!help [cmd|group] | !hilfe | Overview; with a command, the details |