# Documentation of TLM Solutions

Documentation


# Public Transport Acceleration Technologies

Trams and Buses communicate with traffic lights to get priority and ensure safety in different traffic scenarios. On different locations on the line, they send out a signal to the traffic light to communicate where there are currently located (pre-registration, registration, doors closed and doors closed). This is interpreted by the traffic light to change the order and duration of its cycles.

<figure><img src="https://2698620251-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5V8KZ1pPoM2JFseZZyxE%2Fuploads%2FMbKDgLs5sTFv5TBoK7Eq%2Flsa-beeinflussungs-stecke.png?alt=media&amp;token=dfbc5eeb-d580-4397-b897-51aa63ef0e59" alt="" width="563"><figcaption><p>Traffic light controlled by radio links of buses and trams. Modified grafic from </p></figcaption></figure>

Different standards are used by different cities. Most notably the VDV standard. The image below shows what standard is used in major cities. The different section will list what city uses which standard.

<figure><img src="https://2698620251-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5V8KZ1pPoM2JFseZZyxE%2Fuploads%2FY1L6PSJI2x8upBYjKlL8%2Fvcdb-map-ampelbeeinflussung.png?alt=media&amp;token=d1b6a5ed-2bc9-4720-aaeb-fcbf5ba42729" alt=""><figcaption><p><a href="https://opus4.hbz-nrw.de/opus45-bast/frontdoor/deliver/index/docId/2595/file/V353+BF+Gesamtversion.pdf">Map from bast</a> displaying selected cities with traffic lights controlled by public transport.</p></figcaption></figure>

## VDV Standard

* VDV (Verband Deutscher Verkehrsverbünde) standardized R09 Telegrams in [VDV420](https://knowhow.vdv.de/documents/420/).
* They are sent out with a form of AFSK (FSK over FM) mostly in the 2m band. More information on how to receive this data can be found [here](/infrastructure/r09-receiver).
* Data contained in the telegrams is:
  * Reporting point (Meldepunkt) containing an ID of the traffic light, some kind of information where the vehicle is located and its direction of travel. How a reporting point is "assembled" is not standardized and up to the transport company&#x20;
  * Optional: a line number
  * Optional: a run number
  * Optional: a destination number
  * Optional: delay
  * Optional: other fields used as the standard intends or for custom purposes&#x20;
* The table below shows different cities in Germany that use this standard.

<table><thead><tr><th>City</th><th width="97">Verified</th><th width="131">Frequency</th><th width="154">Telegram Type</th><th>Source</th></tr></thead><tbody><tr><td>Aachen</td><td>✅</td><td>152.85MHz</td><td>R10</td><td></td></tr><tr><td>Augsburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Baden-Baden</td><td></td><td></td><td></td><td></td></tr><tr><td>Berlin (Strab)</td><td>✅</td><td>170.45MHz</td><td>R09.16</td><td></td></tr><tr><td>Bielefeld</td><td></td><td></td><td></td><td></td></tr><tr><td>Bocholt</td><td></td><td></td><td>R09.14</td><td><a href="https://www.bocholt.de/uploads/media/Angaben_im_Rahmen_der_Vorabbekanntmachung.pdf">https://www.bocholt.de/uploads/media/Angaben_im_Rahmen_der_Vorabbekanntmachung.pdf</a></td></tr><tr><td>Bochum</td><td></td><td></td><td></td><td></td></tr><tr><td>Bonn</td><td></td><td></td><td></td><td></td></tr><tr><td>Braunschweig</td><td></td><td></td><td></td><td></td></tr><tr><td>Bremen</td><td></td><td></td><td></td><td></td></tr><tr><td>Bünde</td><td></td><td></td><td></td><td></td></tr><tr><td>Chemnitz</td><td>✅</td><td>153.87MHz</td><td>R09.16</td><td></td></tr><tr><td>Cottbus</td><td></td><td></td><td></td><td></td></tr><tr><td>Darmstadt</td><td></td><td></td><td></td><td></td></tr><tr><td>Detmold</td><td></td><td>152.85MHz</td><td>R09.16</td><td><a href="https://www.detmold.de/fileadmin/user_upload/startseite/Wirtschaft_und_Wissenschaft_in_Detmold/Verkehr/OePNVG_NRW/Anlage_3_Beschreibung_Busbeschleunigung_und_Auflistung_aller_Ampelanlagen_LSA.pdf">https://www.detmold.de/fileadmin/user_upload/startseite/Wirtschaft_und_Wissenschaft_in_Detmold/Verkehr/OePNVG_NRW/Anlage_3_Beschreibung_Busbeschleunigung_und_Auflistung_aller_Ampelanlagen_LSA.pdf</a></td></tr><tr><td>Dresden</td><td>✅</td><td>170.81MHz</td><td>R09.16</td><td></td></tr><tr><td>Düsseldorf</td><td>✅</td><td>155.63MHz</td><td>R09.07</td><td></td></tr><tr><td>Essen</td><td></td><td></td><td></td><td></td></tr><tr><td>Esslingen</td><td></td><td></td><td></td><td></td></tr><tr><td>Frankfurt a. M.</td><td></td><td></td><td></td><td></td></tr><tr><td>Freiburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Freising</td><td>✅</td><td>150.813MHz</td><td></td><td></td></tr><tr><td>Gelsenkirchen</td><td></td><td></td><td></td><td></td></tr><tr><td>Gera</td><td></td><td></td><td></td><td></td></tr><tr><td>Görlitz</td><td></td><td></td><td></td><td></td></tr><tr><td>Gotha</td><td></td><td></td><td></td><td></td></tr><tr><td>Halberstadt</td><td></td><td></td><td></td><td></td></tr><tr><td>Halle (Saale)</td><td></td><td></td><td></td><td></td></tr><tr><td>Hannover</td><td>✅</td><td>150.91MHz</td><td>R09.14</td><td></td></tr><tr><td>Ingolstadt</td><td></td><td></td><td></td><td></td></tr><tr><td>Jena</td><td></td><td></td><td></td><td></td></tr><tr><td>Kaiserslautern</td><td></td><td></td><td></td><td></td></tr><tr><td>Karlsruhe</td><td>✅</td><td>152.93MHz mind. für Busse</td><td>R09.16</td><td><a href="https://www.pforzheim.de/fileadmin/user_upload/veroeffentlichungen/vr_koenigsbach_neulingen/anlage_3_lsa_beschreibung_und_telegramm.pdf">https://www.pforzheim.de/fileadmin/user_upload/veroeffentlichungen/vr_koenigsbach_neulingen/anlage_3_lsa_beschreibung_und_telegramm.pdf</a></td></tr><tr><td>Kassel</td><td></td><td></td><td></td><td></td></tr><tr><td>Kiel</td><td></td><td></td><td></td><td></td></tr><tr><td>Koblenz</td><td></td><td></td><td>R09.16</td><td><a href="https://www.koblenz.de/downloads/aemter-und-eigenbetriebe/presse-und-oeffentlichkeitsarbeit/nahverkehrsplan/17.11.2015-qualitaetsanforderungen-der-stadt-koblenz-auf-basis-des-verbundstandards.pdf?cid=b91">https://www.koblenz.de/downloads/aemter-und-eigenbetriebe/presse-und-oeffentlichkeitsarbeit/nahverkehrsplan/17.11.2015-qualitaetsanforderungen-der-stadt-koblenz-auf-basis-des-verbundstandards.pdf?cid=b91</a></td></tr><tr><td>Krefeld</td><td></td><td></td><td></td><td></td></tr><tr><td>Landshut</td><td></td><td></td><td></td><td></td></tr><tr><td>Lemgo</td><td></td><td></td><td></td><td></td></tr><tr><td>Lübben</td><td></td><td></td><td></td><td></td></tr><tr><td>Lübeck</td><td></td><td></td><td></td><td></td></tr><tr><td>Lüdenscheid</td><td></td><td></td><td></td><td></td></tr><tr><td>Ludwigsburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Ludwigshafen</td><td></td><td></td><td></td><td></td></tr><tr><td>Mainz</td><td></td><td></td><td></td><td></td></tr><tr><td>Marburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Mönchengladbach</td><td>✅</td><td>151.03MHz</td><td>R09.16</td><td></td></tr><tr><td>München</td><td></td><td>149.41MHz, 150.81MHz, 152.91MHz, 154.01MHz, 171.03MHz</td><td>vrmtl. R09.16</td><td><a href="https://www.tirol.gv.at/fileadmin/themen/verkehr/verkehrsplanung/Verkehrsmanagement/Downloads/101022_PRL_VLSA-Tirol_V1.1_inkl_Anh01-Anh10.pdf">https://www.tirol.gv.at/fileadmin/themen/verkehr/verkehrsplanung/Verkehrsmanagement/Downloads/101022_PRL_VLSA-Tirol_V1.1_inkl_Anh01-Anh10.pdf</a>, <a href="https://www.mvv-muenchen.de/fileadmin/mediapool/07-Ueber_den_MVV/02-Dokumente/Ausschreibungen/Muster_2021_LB.pdf">https://www.mvv-muenchen.de/fileadmin/mediapool/07-Ueber_den_MVV/02-Dokumente/Ausschreibungen/Muster_2021_LB.pdf</a></td></tr><tr><td>Münster</td><td>✅</td><td>150.85MHz</td><td>R09.14</td><td></td></tr><tr><td>Neu-Ulm</td><td></td><td></td><td></td><td></td></tr><tr><td>Neubrandenburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Neumünster</td><td></td><td></td><td></td><td></td></tr><tr><td>Nürnberg</td><td>✅</td><td>149.45MHz</td><td></td><td><a href="http://nbgsdr.ddns.net">http://nbgsdr.ddns.net</a></td></tr><tr><td>Offenburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Osnabrück</td><td></td><td></td><td></td><td></td></tr><tr><td>Passau</td><td></td><td></td><td></td><td></td></tr><tr><td>Pforzheim</td><td></td><td>vrmtl. 152.93MHz</td><td>vrmtl. R09.14</td><td><a href="https://www.pforzheim.de/fileadmin/user_upload/veroeffentlichungen/vr_koenigsbach_neulingen/anlage_3_lsa_beschreibung_und_telegramm.pdf">https://www.pforzheim.de/fileadmin/user_upload/veroeffentlichungen/vr_koenigsbach_neulingen/anlage_3_lsa_beschreibung_und_telegramm.pdf</a></td></tr><tr><td>Pirmasens</td><td></td><td></td><td></td><td></td></tr><tr><td>Regensburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Rostock</td><td></td><td></td><td></td><td></td></tr><tr><td>Saarbrücken</td><td></td><td></td><td></td><td></td></tr><tr><td>Schwerin</td><td></td><td></td><td></td><td></td></tr><tr><td>Solingen</td><td></td><td></td><td></td><td></td></tr><tr><td>Stuttgart</td><td></td><td></td><td></td><td></td></tr><tr><td>Ulm</td><td>✅</td><td>152.93MHz</td><td>R09.18</td><td></td></tr><tr><td>Unna</td><td></td><td></td><td></td><td></td></tr><tr><td>Weiden i. d. OPf.</td><td></td><td></td><td></td><td></td></tr><tr><td>Weimar</td><td></td><td></td><td></td><td></td></tr><tr><td>Wiesbaden</td><td></td><td></td><td></td><td></td></tr><tr><td>Wiesbaden Nord</td><td></td><td></td><td>R09.14</td><td><a href="https://www.bocholt.de/uploads/media/Angaben_im_Rahmen_der_Vorabbekanntmachung.pdf">https://www.bocholt.de/uploads/media/Angaben_im_Rahmen_der_Vorabbekanntmachung.pdf</a></td></tr><tr><td>Wolfsburg</td><td></td><td></td><td></td><td></td></tr><tr><td>Wuppertal</td><td></td><td></td><td></td><td></td></tr><tr><td>Zwickau</td><td></td><td></td><td></td><td></td></tr></tbody></table>

The following cities outside Germany also use this standard.

* Somewhere in Noway R09.16 is used: <https://ruter.no/globalassets/kollektivanbud/bussanbud/2019-busstjenester-romerike/vedlegg-1-bilag-1.3---tsp-v.1.0.pdf?id=13039>
* Austria/Tirol: 146.075MHz <https://www.tirol.gv.at/fileadmin/themen/verkehr/verkehrsplanung/Verkehrsmanagement/Downloads/101022_PRL_VLSA-Tirol_V1.1_inkl_Anh01-Anh10.pdf>
* Austria/Innsbruck: 168.525MHz\
  Austria/Tirol: 146.8MHz\
  <https://www.tirol.gv.at/fileadmin/themen/verkehr/verkehrsplanung/Verkehrsmanagement/Downloads/Systemstudie_DFI.pdf>
* Austria/Vienna: 146.075MHz\
  <https://www.wien.gv.at/wirtschaft/auftraggeber-stadt/pdf/wien-vi-003.pdf>
* Poland/Krakau: 448.0625MHz\
  <https://zdmk.krakow.pl/wp-content/uploads/2019/10/Za%C5%82%C4%85cznik-nr-1-1.pdf>

## NEMO

| CIty            | Verified | Frequency | Telegram Type | Source |
| --------------- | -------- | --------- | ------------- | ------ |
| Plauen          |          | 149.49MHz |               |        |
| Mönchengladbach |          | 159.27MHz |               |        |

## TETRA

Bochum, Bonn, Dortmund, Cologne

## Tetrapol

Berlin (Buses), Hamburg

## Cellular Phone Network

Böblingen, Dresden, Düsseldorf, Heidenau

V2X in Dresden: <https://libdoc.fh-zwickau.de/opus4/frontdoor/deliver/index/docId/14549/file/Diplom_Morgner_Tobias_38460.pdf>

## WLAN IEEE802.11p -- ETSI ITS G5

Düsseldorf

Kassel: <https://www.testfeldmonitor.de/Testfeldmonitoring/DE/Suche/Testfeldmonitoring_Detailansicht_Projekt.html?cms_projektId=30>

## Others

Magdeburg (Infrared), Nordhausen (Oberleitungskontakte)


# Concept Location Finder

[lofi](https://github.com/tlm-solutions/lofi/tree/master) is the library for the use-case described below.

***

Trams and buses send out different telegrams with some ID (Meldepunkt) at a specific point on the line. To build a mapping between this ID and a GPS coordinate, we need the following components:

* a mobile app to track a vehicle
* uses input stating which vehicle (line number, run number) it is
* a radio for receiving for telegrams

The user input can be compared with the associated fields in the telegram. By aligning the time of the GPS points with the time of the received telegrams, one can build a mapping.

<figure><img src="https://2698620251-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5V8KZ1pPoM2JFseZZyxE%2Fuploads%2FrRLDZajdOYsn1EzpfD4i%2Flofi-diagram.png?alt=media&amp;token=f4fbb899-2f98-4644-9c36-46a7984fb0e4" alt=""><figcaption><p>A vehicle moves over an intersection and sends out telegrams at different locations. By combining two data streams over the shared variable time, a mapping is build between them.</p></figcaption></figure>


# R09 Receiver

## Background and Theory

Traffic lights are controlled by radio links of buses and trams. This page will focus on the [VDV420](https://knowhow.vdv.de/documents/420/) standard (also R09) which is widely deployed in Germany.

This data can be received by a Software Defined Radio and an antenna. The signal is usually in or near the 2m band. However, commercial receivers also support different frequencies. See [here](https://www.sigidwiki.com/wiki/Traffic_Light_Control_R09) for more information.

{% tabs %}
{% tab title="Waterfall of the Transmission" %}

<figure><img src="https://2698620251-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5V8KZ1pPoM2JFseZZyxE%2Fuploads%2FwusM4QVNGKXPpRXeLnN5%2Fspectrum_chemnitz_cropped.png?alt=media&amp;token=dc6ecc34-1708-448f-af41-60bcfec59357" alt="" width="384"><figcaption></figcaption></figure>
{% endtab %}

{% tab title="Waterfall of the Transmission (Zommed In)" %}

<figure><img src="https://2698620251-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5V8KZ1pPoM2JFseZZyxE%2Fuploads%2FKp19VCc4UO3LHwPXABZE%2Fspectrum_dresden_cropped.png?alt=media&amp;token=ae745a39-5988-4fa7-b60b-e70c0b5363b9" alt="" width="384"><figcaption></figcaption></figure>
{% endtab %}
{% endtabs %}

The modulation is a special AFSK modulation with one half-wave 1200Hz as a logical 1 and a full-wave 2400Hz as a logical 0. The modulation does not have phase jumps.

The demodulation is done in gnuradio-decoder which passes the logical 1s and 0s to telegram-decoder, in turn parsing the R09 telegrams and sending them off to a server.

{% @mermaid/diagram content="flowchart TB
subgraph receiver
antenna --> hardware-filter --> SDR --> |IQ samples| r09-receiver --> telegram-decoder
end

```
telegram-decoder -.->|HTTP Post| server

click hardware-filter "https://github.com/tlm-solutions/bandpass-filter" _blank
click telegram-decoder "https://github.com/tlm-solutions/telegram-decoder" _blank
click funnel "https://github.com/tlm-solutions/funnel" _blank
```

" fullWidth="false" %}

## Receiver Hardware

An actual receiver can look something like this (minimal hardware setup):

<figure><img src="https://2698620251-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5V8KZ1pPoM2JFseZZyxE%2Fuploads%2FKELFXDtFzxHeqMD4tZGu%2Fassembled_box.jpg?alt=media&amp;token=bfc6ec6f-0e15-4cab-8fac-2514fb3d6c24" alt="" width="563"><figcaption></figcaption></figure>

We recommend using any NixOS compatible x86\_64 thin client. The software also supports aarch64, but getting everything to work on those devices is always tricky at best.

We tested the following devices and are running them in productions:

| device name      | architecture | notes                                        | working |
| ---------------- | ------------ | -------------------------------------------- | ------- |
| Dell Wyse 3040   | x86\_64      | insanely cheap, standard device we use       | ✅       |
| Raspberry Pi 3B+ | aarch64      | resolvable problems with bootloader on nixos | ✅       |
| Raspberry Pi 4   | aarch64      | very nice with POE hat                       | ✅       |

We discourage from using any of the following devices:

* **Raspberry Pi 0,1,2**: are old 32bit architectures for which cross compiling gets increasingly difficult.
* Everything that doesn't have at least one USB-3 Port + Another USB Port for supplying power to the hardware filter.
* Everything that isn't x86\_64 or aarch64
* Everything without a wired Ethernet connection


# Internal Service Overview

There are quite a lot of services required to acquire and preset the public transport data. The figure below shows the current services and which data in what format flows between them. Clicking on different text boxes will open their GitHub repository or documentation.

{% @mermaid/diagram content="flowchart TB
subgraph traffic-stop-box
antenna --> hardware-filter --> SDR --> |IQ samples| r09-receiver --> telegram-decoder
end

```
telegram-decoder -.->|HTTP Post| data-accumulator

subgraph data-hoarder

data-accumulator --> |<a href='https://github.com/tlm-solutions/tlms.rs/blob/31b1ba0092ed99a36b3c0215dc35d4dcb545eddb/proto/telegram.proto#L25'>gRPC</a>| chemo

trekkie --> |<a href='https://github.com/tlm-solutions/tlms.rs/blob/31b1ba0092ed99a36b3c0215dc35d4dcb545eddb/proto/telegram.proto#L15'>gRPC</a>| chemo

chemo --> |<a href='https://github.com/tlm-solutions/tlms.rs/blob/31b1ba0092ed99a36b3c0215dc35d4dcb545eddb/proto/telegram.proto#L45'>gRPC</a>| funnel
chemo --> |<a href='https://github.com/tlm-solutions/tlms.rs/blob/31b1ba0092ed99a36b3c0215dc35d4dcb545eddb/proto/telegram.proto#L45'>gRPC</a>| bureaucrat

datacare <--> |<a href='https://datacare.tlm.solutions/swagger-ui/'>HTTP</a>| kindergarten

funnel --> |<a href='https://github.com/tlm-solutions/funnel/blob/master/src/filter.hpp'>gRPC over WebSocket with filters</a>|kindergarten

bureaucrat --> redis --> lizard --> |<a href='https://lizard.tlm.solutions/swagger-ui/'>HTTP</a>| kindergarten

0-json[(0.json)] -.-> kindergarten
4-json[(4.json)] -.-> kindergarten

postgres-tlms --> grafana
postgres-tlms <--> data-accumulator
postgres-tlms <--> trekkie
postgres-tlms <--> datacare
postgres-tlms --> chemo

postgres-tlms[(Postgres `tlms`)]
redis[(Redis)]

end

    user[/User\]
    grafana <-.- |<a href='https://grafana.tlm.solutions'>HTTP</a>|user
    kindergarten <-.- |<a href='https://map.tlm.solutions'>HTTP</a>|user

strasi-user[/Strasi User\]
trekkie <-.- |<a href='https://trekkie.tlm.solutions/swagger-ui/'>HTTP</a>| strasi-user

click hardware-filter "https://github.com/tlm-solutions/bandpass-filter" _blank
click gnuradio-decoder "https://github.com/tlm-solutions/gnuradio-decoder" _blank
click telegram-decoder "https://github.com/tlm-solutions/decode-server" _blank
click data-accumulator "https://github.com/tlm-solutions/data-accumulator" _blank
click funnel "https://github.com/tlm-solutions/funnel" _blank
click bureaucrat "https://github.com/tlm-solutions/bureaucrat" _blank
click lizard "https://github.com/tlm-solutions/lizard" _blank
click trekkie "https://github.com/tlm-solutions/trekkie" _blank
click kindergarten "https://github.com/tlm-solutions/kindergarten" _blank
click datacare "https://github.com/tlm-solutions/datacare" _blank
click chemo "https://github.com/tlm-solutions/chemo" _blank" fullWidth="true" %}
```

One of the key concepts is to abstract away from acquired real world data and create value with this data by presenting it in an enriched and simplified form. This is done by the application chemo.

Chemo combines R09 Telegrams from data-accumulator and GPS data from trekkie into a unified format that contains Line, Run and GPS location and optional data.

This is served to the user via funnel in real-time and lizard, showing the state of the traffic network.

Individual API docs can be found here:

* Swagger UI for [lizard](https://lizard.tlm.solutions/swagger-ui/)
* Swagger UI for [datacare](https://datacare.tlm.solutions/swagger-ui/)
* Swagger UI for [trekkie](https://trekkie.tlm.solutions/swagger-ui/)


# Database Overview

{% @mermaid/diagram content="erDiagram
gps\_points {
BIGSERIAL id PK
UUID trekkie\_run FK "trekkie\_runs(id)"
TIMESTAMP timestamp
DOUBLE lat
DOUBLE lon
DOUBLE elevation         "optional"
DOUBLE accuracy          "optional"
DOUBLE vertical\_accuracy "optional"
DOUBLE bearing           "optional"
DOUBLE speed             "optional"
}

```
r09_telegrams {
    BIGSERIAL id PK
    TIMESTAMP time
    UUID station FK "stations(id)"
    BIGINT r09_type
    INT delay              "optional"
    INT reporting_point
    INT junction
    SMALLINT direction
    SMALLINT request_status
    SMALLINT priority           "optional"
    SMALLINT direction_request  "optional"
    INT line               "optional"
    INT run_number         "optional"
    INT destination_number "optional"
    INT train_length       "optional"
    INT vehicle_number     "optional"
    SMALLINT operator           "optional"
    BIGINT region FK "regions(id)"
}

r09_transmission_locations {
    BIGSERIAL id PK
    BIGINT region FK "regions(id)"
    INT reporting_point
    DOUBLE lat
    DOUBLE lon
    BOOLEAN ground_truth
}

r09_transmission_locations_raw {
    BIGSERIAL id PK
    BIGINT region FK "regions(id)"
    INT reporting_point
    DOUBLE lat
    DOUBLE lon
    UUID trekkie_run FK "trekkie_runs(id)"
    UUID run_owner FK "users(id)"
}

raw_telegrams {
    BIGSERIAL id PK
    TIMESTAMP time
    UUID station FK "stations(id)"
    BIGINT telegram_type
    BYTEA data
}

regions {
    BIGSERIAL id PK
    TEXT name
    TEXT transport_company
    TEXT regional_company   "optional"
    BIGINT frequency          "optional"
    BIGINT r09_type           "optional"
    INT encoding           "optional"
    BOOLEAN deactivated
    FLOAT lat
    FLOAT lon
    FLOAT zoom
    FLOAT work_in_progress
}

region_statistics {
    BIGINT id PK "regions(id)"
    TIMESTAMP last_updated
    BIGINT total_telegrams
    BIGINT month_telegrams
    BIGINT week_telegrams
    BIGINT day_telegrams
    BIGINT total_gps
    BIGINT month_gps
    BIGINT week_gps
    BIGINT day_gps
}

stations {
    UUID id PK
    VARCHAR(36) token                 "optional"
    TEXT name
    DOUBLE lat
    DOUBLE lon
    BIGSERIAL region FK "regions(id)"
    UUID owner FK "users(id)"
    BOOLEAN approved
    BOOLEAN deactivated
    BOOLEAN public
    INT radio                    "optional"
    INT architecture             "optional"
    INT device                   "optional"
    DOUBLE elevation              "optional"
    INT antenna                  "optional"
    TEXT telegram_decoder_version "optional"
    TEXT notes                    "optional"
    UUID organization FK "organizations(id)"
}

station_statistics {
    UUID id PK "stations(id)"
    TIMESTAMP last_updated
    BIGINT total_telegrams
    BIGINT month_telegrams
    BIGINT week_telegrams
    BIGINT day_telegrams
}

trekkie_runs {
    TIMESTAMP start_time
    TIMESTAMP end_time
    INT line
    INT run
    BIGSERIAL region FK "regions(id)"
    UUID owner FK "users(id)"
    BOOLEAN finished
    UUID id PK
    BOOLEAN correlated
}

users {
    UUID id PK
    TEXT name          "optional"
    TEXT email         "optional"
    VARCHAR(100) password
    INT email_setting "optional"
    BOOLEAN deactivated
    BOOLEAN admin
}

user_statistics {
    UUID id PK "users(id)"
    TIMESTAMP last_updated
    BIGINT total_gps
    BIGINT month_gps
    BIGINT week_gps
    BIGINT day_gps
}

organizations {
    UUID id PK
    TEXT name
    BOOLEAN public
    UUID owner FK "users(id)"
    BOOLEAN deactivated
}

org_users_relations {
    UUID id PK
    UUID organization FK "organizations(id)"
    UUID user_id FK "users(id)"
    INT role
}
```

r09\_transmission\_locations }|--|| regions : "has"
region\_statistics ||--o| regions : "statistics"
r09\_telegrams }|--|| regions : "received in"
r09\_transmission\_locations\_raw }|--|| regions : ""
stations }|--|| regions : "contains"

gps\_points }|--|| trekkie\_runs : "contains"
trekkie\_runs }|--|| users : "from"

r09\_transmission\_locations\_raw }|--|| users : ""
trekkie\_runs }|--|| regions : "in"
r09\_transmission\_locations\_raw }|--|| trekkie\_runs : "contains"

r09\_telegrams }|--|| stations : "received"
raw\_telegrams }|--|| stations : "received"
stations }|--|| organizations: "belongs"
stations }|--|| users : "owns"
organizations }|--|| users : "owns"
org\_users\_relations }|--|| users : "has role"
org\_users\_relations }|--|| organizations : "associated key"
station\_statistics ||--o| stations : "statistics"
user\_statistics ||--o| users : "statistics"
" fullWidth="true" %}


# bureaucrat

### TLMS.bureaucrat.enable

Wether to enable bureaucrat service

*Type:* boolean

*Default:* `false`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.group

group of systemd user

*Type:* string

*Default:* `"bureaucrat"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.grpc.host

To which IP bureaucrat should bind its grpc server.

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.grpc.port

To which port should bureaucrat bind its grpc server.

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `8080`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.log\_level

log level of the application

*Type:* string

*Default:* `"info"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.redis.host

Database host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.redis.port

Database port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `5354`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.bureaucrat.user

systemd user

*Type:* string

*Default:* `"bureaucrat"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)


# chemo

### TLMS.chemo.enable

Wether to enable chemo service

*Type:* boolean

*Default:* `false`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.GRPC

list of grpc endpoint where chemo should send data to

*Type:* list of (submodule)

*Default:* `[ ]`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.GRPC.\*.host

GRPC: schema://hostname

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.GRPC.\*.name

GRPC name

*Type:* string

*Default:* `""`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.GRPC.\*.port

GRPC port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `50051`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.GRPC.\*.schema

schema to connect to GRPC

*Type:* one of “http”, “https”

*Default:* `"http"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.database.database

postgres database to use

*Type:* string

*Default:* `"tlms"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.database.host

Database host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.database.passwordFile

password file from which the postgres password can be read

*Type:* path or Concatenated string

*Default:* `""`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.database.port

Database port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `5354`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.database.user

user for postgres

*Type:* string

*Default:* `"chemo"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.group

group of systemd user

*Type:* string

*Default:* `"chemo"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.host

To which IP chemo should bind its grpc server.

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.log\_level

log level of the application

*Type:* string

*Default:* `"info"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.port

To which port should chemo bind its grpc\_server.

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `8080`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.chemo.user

systemd user

*Type:* string

*Default:* `"chemo"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)


# datacare

### TLMS.datacare.enable

Wether to enable datacare: TLMS colorful and clicky registration tool

*Type:* boolean

*Default:* `false`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.allowedIpsExport

List of Ip Prefixes that should have access to the export endpoint

*Type:* list of Concatenated string

*Default:* `[ ]`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.cookieDomain

domain of the api

*Type:* string

*Default:* `"tlm.solutions"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.database.database

postgres database that should be used

*Type:* string

*Default:* `"tlms"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.database.host

file from where the postgres password can be read

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.database.passwordFile

file from where the postgres password can be read

*Type:* string or path

*Default:* `""`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.database.port

port of the postgres database

*Type:* signed integer

*Default:* `5070`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.database.user

user of the postgres database

*Type:* string

*Default:* `"datacare"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.group

group of systemd user

*Type:* string

*Default:* `"datacare"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.http.host

host of datacare

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.http.port

port of datacare

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `5070`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.log\_level

log level of the application

*Type:* string

*Default:* `"datacare"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.redis.host

Host on which redis is listening

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.redis.port

Redis port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `6379`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.rustBacktrace

rust backtrace

*Type:* string

*Default:* `"FULL"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.saltFile

file from where the salt can be read

*Type:* string or path

*Default:* `""`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)

### TLMS.datacare.user

systemd user

*Type:* string

*Default:* `"datacare"`

*Declared by:*

* [/nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix](file:///nix/store/z7y28qzhk7driiwcw78k0mb24laknm0f-source/flake.nix)


# data-accumulator

### TLMS.dataAccumulator.enable

Wether to enable data accumulator service

*Type:* boolean

*Default:* `false`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.GRPC

list of grpc endpoint where data-accumulator should send data to

*Type:* list of (submodule)

*Default:* `[ ]`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.GRPC.\*.host

GRPC: schema://hostname

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.GRPC.\*.name

GRPC name

*Type:* string

*Default:* `""`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.GRPC.\*.port

GRPC port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `50051`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.GRPC.\*.schema

schema to connect to GRPC

*Type:* one of “http”, “https”

*Default:* `"http"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.database.database

postgres database to use

*Type:* string

*Default:* `"tlms"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.database.host

Database host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.database.passwordFile

password file from which the postgres password can be read

*Type:* path or Concatenated string

*Default:* `""`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.database.port

Database port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `5354`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.database.user

user for postgres

*Type:* string

*Default:* `"data-accumulator"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.group

group of systemd user

*Type:* string

*Default:* `"data-accumulator"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.host

To which IP data-accumulator should bind.

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.log\_level

log level of the application

*Type:* string

*Default:* `"info"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.port

To which port should data-accumulator bind.

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `8080`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.dataAccumulator.user

systemd user

*Type:* string

*Default:* `"data-accumulator"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)


# funnel

### TLMS.funnel.GRPC.host

on which address the grpc server should bind to

*Type*: string

*Default*

```
"127.0.0.1"
```

### TLMS.funnel.GRPC.port

on which port the grpc server should bind to

*Type*: 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default*

```
50052
```

### TLMS.funnel.defaultWebsocket.host

host of the websocket

*Type*: string

*Default*

```
"127.0.0.1"
```

### TLMS.funnel.defaultWebsocket.port

port of the websocket

*Type*: 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default*

```
9002
```

### TLMS.funnel.enable

enabeling funnel or not

*Type*: boolean

*Default*

```
false
```

### TLMS.funnel.group

group of systemd user

*Type*: string

*Default*

```
"funnel"
```

### TLMS.funnel.metrics.host

address prometheus should bind to

*Type*: string

*Default*

```
"127.0.0.1"
```

### TLMS.funnel.metrics.port

prometheus metrics port

*Type*: 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default*

```
9003
```

### TLMS.funnel.user

systemd user

*Type*: string

*Default*

```
"funnel"
```


# r09-receiver

### TLMS.r09-receiver.BB

*Type*: signed integer

*Default*

```
42
```

### TLMS.r09-receiver.IF

*Type*: signed integer

*Default*

```
32
```

### TLMS.r09-receiver.RF

*Type*: signed integer

*Default*

```
14
```

### TLMS.r09-receiver.device

Device string to pass to gnuradio

*Type*: string

*Default*

```
""
```

*Example*

```
"hackrf=0"
```

### TLMS.r09-receiver.enable

Wether[^1] to enable TLMS gnuradio reciever

*Type*: boolean

*Default*

```
false
```

### TLMS.r09-receiver.frequency

Frequency to tune radio to

*Type*: signed integer

*Default*

```
170795000
```

### TLMS.r09-receiver.group

as which group gnuradio should run

*Type*: string

*Default*

```
"gnuradio"
```

### TLMS.r09-receiver.offset

Offset of the signal from center frequency

*Type*: signed integer

*Default*

```
19550
```

### TLMS.r09-receiver.user

as which user gnuradio should run

*Type*: string

*Default*

```
"gnuradio"
```

[^1]:


# lizard

### TLMS.lizard.enable

enabling the service

*Type:* boolean

*Default:* `false`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.group

as which group lizard should run

*Type:* string

*Default:* `"lizard"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.http.host

http host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.http.port

port of the lizard

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `9001`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.logLevel

log level

*Type:* string

*Default:* `"info"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.redis.host

grpc host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.redis.port

grpc port

*Type:* signed integer

*Default:* `50051`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.user

as which user lizard should run

*Type:* string

*Default:* `"lizard"`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)

### TLMS.lizard.workerCount

amount of worker threads used

*Type:* signed integer

*Default:* `4`

*Declared by:*

* [/nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix](file:///nix/store/lrpqrdsldby2sb78w4wkbz8kvbwp8xz1-source/flake.nix)


# telegram-decoder

### TLMS.telegramDecoder.authTokenFile

Path to telegram-decoder auth token

*Type*: string or path

*Default*

```
"/etc/telegram-decoder/token"
```

### TLMS.telegramDecoder.configFile

Path to telegram-decoder config

*Type*: string or path

*Default*

```
"/etc/telegram-decoder/settings.json"
```

### TLMS.telegramDecoder.enable

Wether to enable TLMS telegram-decoder

*Type*: boolean

*Default*

```
false
```

### TLMS.telegramDecoder.errorCorrection

enable or disable error correction

*Type*: boolean

*Default*

```
true
```

### TLMS.telegramDecoder.logLevel

under which logLevel the service should run

*Type*: one of "info", "warn", "error", "debug", "trace"

*Default*

```
"info"
```

### TLMS.telegramDecoder.offline

runs telegram-decoder in offline mode used for mobile stations

*Type*: boolean

*Default*

```
false
```

### TLMS.telegramDecoder.server

URL of the TLMS websocket

*Type*: list of string

*Default*

```
["https://dump.dvb.solutions/"]
```


# trekkie

### TLMS.trekkie.enable

Wether to enable trekkie service

*Type:* boolean

*Default:* `false`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.database.database

Database which should be used

*Type:* string

*Default:* `"tlms"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.database.host

Database host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.database.passwordFile

password file from which the postgres password can be read

*Type:* path or Concatenated string

*Default:* `""`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.database.port

Database port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `5354`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.database.user

Database User to connect as

*Type:* string

*Default:* `"tlms"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.group

group of systemd user

*Type:* string

*Default:* `"trekkie"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.grpc.host

To which address trekkie should connect

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.grpc.port

On which port the service runs

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `8080`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.host

To which IP trekkie should bind.

*Type:* string

*Default:* `"0.0.0.0"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.logLevel

log level of the application

*Type:* string

*Default:* `"info"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.port

To which port should trekkie bind.

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `8080`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.redis.host

redis host

*Type:* string

*Default:* `"127.0.0.1"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.redis.port

redis port

*Type:* 16 bit unsigned integer; between 0 and 65535 (both inclusive)

*Default:* `6379`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.saltPath

File from which the password salt can be taken

*Type:* path or Concatenated string

*Default:* `"/run/secrets/salt_path"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)

### TLMS.trekkie.user

systemd user

*Type:* string

*Default:* `"trekkie"`

*Declared by:*

* [/nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix](file:///nix/store/mbz4hixfgxq5b6vc0k3pp2iglcd4c353-source/flake.nix)


