{"id":23382134,"url":"https://github.com/chiefenne/jeti_ex_bus","last_synced_at":"2025-07-06T05:38:23.741Z","repository":{"id":75755284,"uuid":"358680060","full_name":"chiefenne/JETI_EX_BUS","owner":"chiefenne","description":"A MicroPython implementation of the JETI Ex Bus protocol","archived":false,"fork":false,"pushed_at":"2025-02-24T23:01:42.000Z","size":116474,"stargazers_count":11,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T23:52:25.162Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chiefenne.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-16T17:57:51.000Z","updated_at":"2025-02-23T09:32:02.000Z","dependencies_parsed_at":"2025-02-03T20:35:18.732Z","dependency_job_id":null,"html_url":"https://github.com/chiefenne/JETI_EX_BUS","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chiefenne%2FJETI_EX_BUS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chiefenne%2FJETI_EX_BUS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chiefenne%2FJETI_EX_BUS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chiefenne%2FJETI_EX_BUS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chiefenne","download_url":"https://codeload.github.com/chiefenne/JETI_EX_BUS/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248317705,"owners_count":21083528,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-21T21:17:39.578Z","updated_at":"2025-04-10T23:52:35.765Z","avatar_url":"https://github.com/chiefenne.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# JETI Ex Bus protocol (Python)\n[![GitHub](https://img.shields.io/github/license/mashape/apistatus.svg)](https://en.wikipedia.org/wiki/MIT_License)\n\n## Introduction\n\nA [JETI EX BUS protocol](http://www.jetimodel.com/en/Telemetry-Protocol/) implementation in Python or more specifically in [MicroPython](https://micropython.org/).\nThis allows to use microcontrollers (aka boards) like Raspbery Pi, ESP32 or similar to act as a sensor hub for [Jeti RC receivers](http://www.jetimodel.com/en/katalog/Duplex-2-4-EX/Receivers-EX/) and to transmit telemetry data from the board to the receiver and back to the transmitter (i.e. RC controls like this [DC24](http://www.jetimodel.com/en/katalog/Transmitters/@produkt/DC-24/)).\n\n[Raspberry Pi  RP2040](https://www.raspberrypi.com/products/rp2040/) based platforms were used for development. The main application is to use the software on these boards together with one or more sensors attached to it. The main sensor interface is based on the [I2C protocol](https://en.wikipedia.org/wiki/I%C2%B2C). So all sensors using this interafce can be easiliy integrated, some are already predifined (see section features).\n\n\nThe code runs on two cores. One core handles the telemetry transfer, the other core prepares the telemetry based on data retrieved from sensors.\n\n\n## Features\n\n - Pure Python (MicroPython) implementation of the Jeti Ex Bus protocol\n - Variometer functionality - currently following pressure sensors are supported:\n   - [MS5611](https://www.amsys-sensor.com/products/pressure-sensor/ms5611-high-resolution-barometric-sensor-10-1200-mbar/)\n   - [BME280](https://www.bosch-sensortec.com/products/environmental-sensors/humidity-sensors-bme280/)\n - Can be extended by any I2C capable sensor\n - Simple firmware/software update via USB-C\n - Easy logging of sensor data\n - Runs on boards which are supported by MicroPython (see [forum](https://forum.micropython.org/viewforum.php?f=10) or [code repository](https://github.com/micropython/micropython/tree/master/ports))\n - Two core implementation\n   - Core-0 handles the transfer of JETI telemetry data via UART\n   - Core-1 does the sensor reading via I2C and prepares the packets for the EX and EX-BUS protocols\n\n\u003e NOTE: Due to the implementation only boards with two cores are supported\n\n## Boards\n\n Raspberry Pi RP2040 based boards are the main platform for this software. Other boards featuring two cores and running on MicroPython will be checked in the future.\n\n - [Raspberry Pi Pico series](https://www.raspberrypi.com/products/raspberry-pi-pico/)\n - [Pimoroni TINY 2040](https://shop.pimoroni.com/products/tiny-2040), small form factor (22.9 x 18.2 mm)\n - [Seeed Studio XIAO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html), small form factor (21 x 17.5 mm)\n\n\n## Dependencies\n\n - [MicroPython](https://micropython.org/)\n\n## Installation\n\nAfter finishing board and sensors (see further down) the MicroPython firmware needs to be installed. The firmware then is the operating system where MicroPython code can run. After this the software must be copied onto the board.\n\n### Following steps describe the process:\n1. Download the Micropython firmware for the specific board in use\n   - As an example, the [XAIO RP2040](https://www.seeedstudio.com/XIAO-RP2040-v1-0-p-5026.html) runs the [Raspberry Pi Pico](https://micropython.org/download/rp2-pico/)  firmware\n   - The firmware typically comes in the [USB flashing format (UF2)](https://github.com/Microsoft/uf2), for example [rp2-pico-20230426-v1.20.0.uf2](https://micropython.org/resources/firmware/rp2-pico-20230426-v1.20.0.uf2)\n1. Press and hold the boot button (B) on the board, connect the USB-C cable and then release the button. This will put the board into the so called ***bootloader mode***. The board should now appear as USB drive on the computer\n1. Copy (drag) the firmware onto this USB drive\n1. Disconnect and re-connect the USB-C plug. The board is now ready to run MicroPython code\n1. Use one of the following tools ([mpremote](https://docs.micropython.org/en/latest/reference/mpremote.html?highlight=mpremote), [Thonny](https://thonny.org/), [rshell](https://github.com/dhylands/rshell), [tio](https://github.com/tio/tio), etc.) to upload all files and folders to the board.\n     The command line tool `mpremote` is the recommended way, as it allows to copy all files at once. The following command installs all files from this repository onto the board:\n     ```\n     mpremote mip install --target=/ github:chiefenne/JETI_EX_BUS\n     ```\n     To install a specific GitHub branch (e.g., develop) use:\n     ```\n     mpremote mip install --target=/ github:chiefenne/JETI_EX_BUS@develop\n     ```\n\n1. Unplug the USB-C cable and connect the board/sensor to the JETI receiver\n1. Ready to go!\n\n\u003cbr\u003e\n\n\u003e NOTE: From the MicroPython docs: \"The exact procedure for these steps is highly dependent on the particular board and you will need to refer to its documentation for details.\"\n\n\u003e NOTE: If there is already an older release of [JETI Ex Bus protocol (Python)](https://github.com/chiefenne/JETI_EX_BUS) installed, and an upddate to a newer version is performed, it is highly recommended to delete at first all files from the board. See below how to do that.\n\n\u003cbr\u003e\n\nWiping the board, is at the time of this writing, not easily possible with ```mpremote```. The filesystem can be formatted with the following fancy command for RP2040 boards (copied from [here](https://forum.micropython.org/viewtopic.php?t=12674)):\n\n```\nmpremote exec --no-follow \"import os, machine, rp2; os.umount(/); bdev = rp2.Flash(); os.VfsLfs2.mkfs(bdev, progsize=256); vfs = os.VfsLfs2(bdev, progsize=256); os.mount(vfs, /); machine.reset()\"\n```\n\nSooner or later ```mpremote``` will have an option to achieve this in a simpler way. Check for this.\n\n## Hardware Layer\n\n The flowchart (Fig. 1) describes the setup of the hardware and indicates the physical connections. The microcontroller is connected with the receiver via a serial asynchronous interface [UART](https://de.wikipedia.org/wiki/Universal_Asynchronous_Receiver_Transmitter). Physically the connection uses three wires (vcc, gnd, signal). Examples are shown in figures 9, 10 and 11.\n\n The Jeti telemetry runs via a half-duplex serial communication protocol. This means that there is a master (receiver) controlling the data flow and a slave (microcontroller/sensor) which is only allowed to answer upon request from the master. The master reserves a 4ms period for this to work. Measurments show approximately a 6ms period (see also figure 10).\n\n The connection between the board and the sensors is established via [I2C](https://de.wikipedia.org/wiki/I%C2%B2C). Four wires (vcc, gnd, sda, scl) are needed to connect each of the sensors.\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/hardware_layer.png\" width=\"700\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 1: Data flow and physical connections\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n## Program Logic\n\nThe program logic consists of two parts. Those are the similar to the Arduino \u003cb\u003e*setup()*\u003c/b\u003e and \u003cb\u003e*loop()*\u003c/b\u003e functions.\n\n  * In the beginning the communication channels (UART, I2C) are initialized. A serial connection (UART) is established between the microcontroller and the receiver. Additionally an I2C connection is setup between the microcontroller and the sensor(s).\n  * After the setup of the communication, the two main (infinite) loops start, one infinite loop on each core.\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/program_logic.png\" width=\"700\"/\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 2: Communication layer and multicore protocol handler\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n## Connecting board and sensor\n\nBelow example shows how a [BME280](https://www.bosch-sensortec.com/products/environmental-sensors/humidity-sensors-bme280/) pressure sensor is soldered to a XIAO RP2040 board. In a similar way the VCC and GND connections between both boards are soldered as well (see figures 4, 5, 7).\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/setup_XIAO2040_JetiRex6_04.png\" width=\"600\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 3: BME280 sensor at first connected to SDA, SCL. The sensor is then flipped down.\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\nThe following images show the components and connections for a XIAO RP2040 board. For other boards the respective UART pins (TX, RX) have to be selected according the board specific pinout. After the pressure sensor is flipped down, the power and ground (GND) connections can be established. Double-sided adhesive tape or hot glue fix the board and the sensor to each other.\n\nThe voltage requirements of the sensor have to be checked, the used [BME280](https://www.bosch-sensortec.com/products/environmental-sensors/humidity-sensors-bme280/) sensor runs on 3.3V. The respective 3.3V pin on the microcontroller has then to be connected to VCC on the sensor.\n\nThe servo cable (red, brown, orange) is soldered according to the image below. The servo signal cable (orange) goes to RX (pin D7). The VIN pin (5V) is used for the power connection between receiver and board. If the board is connected to a USB-C cable then this pin outputs approximately 5V and powers the receiver if it is attached. If used in the RC plane then the power comes from the receiver to the board (of course no USB cable is attached then).\n\n\nA resistor (2.4 k\u0026Omega; up to a few k\u0026Omega;s) needs to be soldered between the TX and RX pins. On the XIAO RP2040 these are pins D6 and D7 respectively. The resitor enables the half-duplex communication which is triggered by the JETI receiver.\n\u003cbr\u003e\n\n\u003c!-- HTML syntax for image display allows to change the image size --\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/setup_XIAO2040_JetiRex6_01.png\" width=\"600\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 4: Setup with a BME280 sensor. 3.3V (red) and GND (black) from board to sensor\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/setup_XIAO2040_JetiRex6_02.png\" width=\"600\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 5: Data (SDA, yellow) and clock (SCL, green) connections for I2C bus\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\nFigure 6 shows a USB-C plug connected to the microcontroller. The connection from the microcontroller to the JETI receiver needs to be on a socket (here 6), which is set to run the EX BUS protocol (see figure 8).\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/setup_XIAO2040_JetiRex6_03.png\" width=\"600\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 6: Setup for software update and development\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/setup_XIAO2040_JetiRex6_05.png\" width=\"600\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 7: Here an MS5611 sensor is attached\u003c/i\u003e\n\u003c/p\u003e\n\na\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/comparison_to_MVario2_01.png\" width=\"600\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 7a: Comparison of climb rate (green) with Jeti MVario2 (red)\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n### Channel setup in the device manager of the transmitter\n\nBelow figure depicts the JETI display for the receiver settings (German language).\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/EX_Bus_channel_6.png\"/\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 8: The receiver channel where the microcontroller is connected needs the \u003cb\u003eEX Bus\u003c/b\u003e setting activated\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n## Data from logic level analyzer\n\nThe data recorded are coming from the master (receiver) and show a duration of approximately **3.8ms** for the channel data and the concatenated telemetry request (see figure below). Click on the image to see a larger version.\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/EX_Bus_logic_analyzer_01.png\" width=\"900\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 9: Jeti EX BUS protocol. Example shows channel data (i.e., transmitter controls) and then a telemtry request\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\nThe time between two channel/telemetry request packages is approximately **6.2ms**. The EX bus protocol documentation states that a period of **4ms** after the telemetry/JetiBox request is reserved for the answer from the sensor, etc. Click on the image to see a larger version.\n\n\u003cp align=\"center\"\u003e\n\u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n\u003cimg src=\"docs/images/EX_Bus_logic_analyzer_02.png\" width=\"900\" /\u003e\n\u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 10: Jeti EX BUS protocol. Example shows the waiting period allowed for answering with telemetry\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\nThe image below shows a detailed view of the beginning of a packet (digital and analog). Click on the image to see a larger version.\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/EX_Bus_logic_analyzer_03.png\" height=\"180\" width=\"900\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 11: Jeti EX BUS protocol. Zoomed view (digital/analog data from the logic level analyzer).\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\nThe next figure depicts a telemetry answer from the microcontroller/sensor (slave). In this case it is an answer from a Jeti MVario 2 sensor. The telemetry data were sent in aprox. **2.7ms**. In order to answer a telemetry request, there are **4ms** reserved on the EX bus, so this packet fits well into that. Click on the image to see a larger version.\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ckbd\u003e \u003c!-- make a frame around the image --\u003e\n    \u003cimg src=\"docs/images/EX_Bus_logic_analyzer_04_telemetry.png\" height=\"180\" width=\"900\" /\u003e\n  \u003c/kbd\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ci\u003eFig. 12: Jeti EX BUS protocol. Example of Jeti MVario 2 telemetry answer.\u003c/i\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n## Sample EX Bus data stream\nWritten by the function [Streamrecorder.py](https://github.com/chiefenne/JETI_EX_BUS/blob/main/src/Utils/Streamrecorder.py) which should only be activated to record the serial stream. This is only meaningful for debugging purposes.\n\nThe receiver is the master and triggers the half-duplex communication. As an example **3e:03** is the beginning of a packet containing channel data sent by the receiver (the packet describes the current actuator settings of the transmitter). A telemetry request (from receiver/master to the microcontroller/sensor) is indicated by **3d:01** which is the start of an 8 byte packet. After this there is a 4ms window to send telemetry data back from the board to the receiver (not visible in this data stream).\n\n```Text\n02:02:7d:dd:2e:e7:2e:f2:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:78:69:3e:03:28:42:31:20:40:1f:dd:2e:e7:2e:f2:2e:e0\n2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:78:69:3d:01:08:42:3a:00:8f:e4:3e:03:28:42:31:20:40:1f:dd:2e:e7:2e:f2:2e:e0\n2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:3e:03:28:42:31:20:40:1f:dd:2e:e7:2e:f2:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0\n2e:e0:2e:78:69:3d:01:08:42:3a:00:8f:e4:3e:03:28:42:31:20:40:1f:dd:2e:e7:2e:f2:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0\n2e:78:69:3d:01:08:42:3a:00:8f:e4:3e:03:28:42:31:20:40:1f:dd:2e:e7:2e:f2:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:78\n69:3d:01:08:42:3a:00:8f:e4:3e:03:28:42:31:20:40:1f:dc:2e:e7:2e:f2:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:e0:2e:8b:49:3d\n```\n\nSee [EX_Bus_stream.txt](https://github.com/chiefenne/JETI_EX_BUS/blob/main/docs/EX_Bus_stream.txt) for a 1 second recording of the bus (this feature can be activated in the code for debugging purposes).\n\n## Credits\n\nApart from the JETI telemetry documentation, the code of this repo has learned from many sources.\n\n\nFollowing sources were most helpful (without those I couldn't have done this at all):\n- [MicroPython docs](https://docs.micropython.org/en/v1.20.0/)\n- [MicroPython forum](https://github.com/orgs/micropython/discussions)\n- [Sepp62](https://github.com/Sepp62/JetiExBus)\n- [nichtgedacht](https://github.com/nichtgedacht/JetiExBus)\n- [nightflyer88](https://github.com/nightflyer88/Jeti_VarioGPS-Sensor)\n- [Pulsar07](https://github.com/Pulsar07/Jeti_VarioGPS-Sensor)\n- [Betaflight Jeti telemetry](https://github.com/betaflight/betaflight/blob/master/src/main/telemetry/jetiexbus.c)\n- [RC-Thoughts](https://github.com/RC-Thoughts)\n\n## License\n\nDistributed under the MIT license. See [LICENSE](https://raw.githubusercontent.com/chiefenne/PyAero/master/LICENSE) for more information.\n\n\u003cbr\u003e\u003cbr\u003e\n2023 Andreas Ennemoser – andreas.ennemoser@aon.at\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchiefenne%2Fjeti_ex_bus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchiefenne%2Fjeti_ex_bus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchiefenne%2Fjeti_ex_bus/lists"}