Heltec HT-M01 LoRa concentrator board for €100

Hi, I found a new concentrator board, the cheapest one to date.
22
It is not a complete gateway, you still need a host/raspberry-pi…

it come enclosured with micro-B USB interface and a SPI connector.
The size is very small, like a raspberry-pi Zero. There is a raspberry-pi adaptor board for $9 (the adapter board has another Micro-USB connector to access the raspberry-pi console).
11

I am in contact with the manufacturer for more info. it is based on the pico gateway reference design, so there is a MCU inside running the libloragw and the picoGW_packet_forwarder runs on the host, so there is no delay/throughput problems using USB instead of SPI interface (even it will run smoother using USB)
https://item.taobao.com/item.htm?spm=2013.1.0.0.3cd46730BFwQNf&id=565546248458

https://www.aliexpress.com/item/SX1301-HT-M01-LoRa-gateway-LoRaWAN-470MHz-DC-5V-HTM01-Module-DIY-Electronic-Kit-Antenna/32864260096.html?spm=a219c.11010108.1000001.7.22d22963htcCrE

available in several bands 433MHz 470MHz 868MHz 915MHz and with SX1301 or SX1308.

1 Like

another seller has different versions: https://de.aliexpress.com/item/Mini-Loragateway-LoraWan-SX1301-sx1255-57-lora-8-kanal-433-MHZ-470-MHZ-868-MHZ-915/32866975902.html

Here is the gateway manual

HT-M01 LoRaGateway user manual.pdf (2.1 MB)

You can use it as a Pico Gateway via USB or as a normal Gateway via SPI.

The tutorial also covers the instalation of loraserver.io network server.

2 Likes

I received the pico gateway 868MHz.

The RX sensitivity is on par to Multitech MTAC and Laird gateways.
The power consumption:
8 Rx channels ON, 230mA @ 5V
TX max power (dig_gain=0, mix_gain=15), 300mA @ 5V
The enclosure is metallic, so it is RF shielded.
The maximum output power I get is 15.5dBm, it should be 20dBm, should investigate.

I also ordered the Raspberry-Pi adapter board, it comes with aditional USB to connect to the Raspberry-Pi console.
IMG_3956%20(1)

IMG_3955

Note: MCU firmware version checked: 0x10A0006
*** MCU FW version for LoRa PicoCell Gateway ***
Version: 0x010A0006


4 Likes

Is that a ‘failing’ of implementation or have they perhaps correctly limited due to 868Mhz op and likely EU target market? - Allows a bit of loss through connectors and feed cable to 14db feed to nominal 2db dipole and stay within regs?..just wondering! :wink:

have you looked at a 915Mhz version to compare?..wonder if that ok for +20/27db…update just seen a user guide refs 25db max (in discussing a 470Mhz version)…

yes, the CN 470MHz version advertises up to +25dBm and the TX LUT table confirms up to +27dBm

I asked manufacturer for the EU 868MHz LUT table

PacketForwarder running on Windows
image

and global_conf.json editor UI
image

2 Likes

Hello,

did somebody already manage to use it for TTN? I got mine yesterday, I also read the tutorial I‘ve downloaded from this side but it‘s not connected on TTN side.

I use a Raspberry Pi Zero W with the SPI adapter board

KR Bernd

use it with USB following this steps

1 Like

Hello nestorayuso,

thank you for the hint. But I have now managed to make my HT-M01 run with the SPI version (at least TTN says my gateway is connected).

The solution is simple: use the installation description of the HT-M01

mkdir lora
cd lora
sudo apt-get update
sudo apt-get install git
git clone GitHub - Lora-net/lora_gateway: Driver/HAL to build a gateway using a concentrator board based on Semtech SX1301 multi-channel modem and SX1257/SX1255 RF transceivers.
git clone GitHub - Lora-net/packet_forwarder: A LoRa packet forwarder is a program running on the host of a LoRa gateway that forwards RF packets receive by the concentrator to a server through a IP/UDP link, and emits RF packets that are sent by the server.
git clone GitHub - HelTecAutomation/lorasdk: Scripts and files for LoRa gateway produced by Heltec automation(TM)
cd /home/pi/lora/lora_gateway
make clean all
cd /home/pi/lora/packet_forwarder
make clean all
cd /home/pi/lora/lorasdk
chmod +x install.sh
./install.sh
sudo cp -f /home/pi/lora/lorasdk/global_conf_CN470.json /home/pi/lora/packet_forwarder/lora_pkt_fwd/global_conf.json

omit the last task and use the original global_conf.json where you update the “gateway_conf”:

“gateway_ID”: “xxxxx”, #<- your gateway id
“server_address”: “router.eu.thethings.network”,
“serv_port_up”: 1700,
“serv_port_down”: 1700,

then you can start it:

pi@RaspiZeroW:~/lora/packet_forwarder/lora_pkt_fwd $ ./lora_pkt_fwd start global_conf.json
*** Beacon Packet Forwarder for Lora Gateway ***
Version: 4.0.1
*** Lora concentrator HAL library version info ***
Version: 5.0.1;


INFO: Little endian host
INFO: found global configuration file global_conf.json, parsing it
INFO: global_conf.json does contain a JSON object named SX1301_conf, parsing SX1301 parameters
INFO: lorawan_public 1, clksrc 1

TTN:

KR Bernd

2 Likes

Hello,

but my HT-M01 is still not working. Connection to TTN is fine but I only get CRC_Errors using the provided global_conf.json

Aug 24 17:42:13 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 17:42:13 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 17:42:13 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 17:49:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 17:49:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 17:49:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 17:55:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 17:55:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 17:55:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 17:55:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 18:01:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 24 18:01:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 18:01:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 18:07:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 18:07:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 24 18:07:00 RaspiZeroW lora_pkt_fwd[585]: # CRC_OK: 0.00%, CRC_FAIL: 0.00%, NO_CRC: 0.00%
Aug 27 11:26:36 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Aug 27 11:32:36 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%

Three status messages with the same time stamp does not look right.

Make sure the node is at least 3 meters away from the gateway or the signal might be too strong resulting in CRC errors.

Hello Jac,

Thank you for the hint!

I have now 5m+ and a wall between my device and my gateway - but the result is still the same: 3 messages per second (every 6 minutes) and all with CRC_FAIL. I had it running all night - but not a single message was successfully received :frowning:

Sep 1 09:12:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:12:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:12:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:18:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:18:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:18:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:18:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:24:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:24:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%
Sep 1 09:24:40 RaspiZeroW lora_pkt_fwd[584]: # CRC_OK: 0.00%, CRC_FAIL: 100.00%, NO_CRC: 0.00%

I’m using the provided global_conf.json for EU868 (and local_conf.jason to overwrite the gateway-id and the server address, which obviously works as I see the gateway on TTN)

KR Bernd

Hi Bernd,

The interval between status messages should be 30 seconds, not 6 minutes. However this might just be a logging issue. Could you check the gateway consoles ‘Last Seen’ message for a couple of minutes? The value should not exceed 35 seconds.

Just to make sure, you are using a 868MHz model, not 443MHz?

Could you post a picture of your setup?

Best regards,

Jac

Hello Jac,

the update on last seen happens precisely every 2 minutes (3x2min = 6min … could be the explanation) in my local_conf.json I use this setting:

/* adjust the following parameters for your network */
“keepalive_interval”: 30,
“stat_interval”: 120,
“push_timeout_ms”: 100,

At least I ordered the 868MHz Version - but there is no info neither on the device nor on the packaging .




As Lora-Device I use a Mini-Ultra-Ultra-Pro3 with Radio from Rocketscream which works fine with TTN but never uses MY gateway but others (see metadata).

mini-ultra-pro-v3-ttn
mini-ultra-pro-v3-metadata

KR Bernd

Hello Jac,

after disassembling the device it turned out that I’ve received the 433MHZ (although I clearly ordered the 868 MHZ version) version as it contains 2 SX1255 (instead of SX1257) :frowning:

Thank you for your support!

KR Bernd

1 Like

Hi Bernd,

That is disappointing. Hopefully the vendor will solve this issue soon.

Best regards,

Jac

1 Like

Hi

One question. Do you receive packets from radio 0? Because I have one TTGO and one Heltec ESP32 and the gateway only receives in radio 1, it seems the channels in radio 0 are not listening:

*** Packet Forwarder for Lora PicoCell Gateway ***
Version: 0.1.0
*** Lora concentrator HAL library version info ***
Version: 0.2.2;
*** MCU FW version for LoRa PicoCell Gateway ***
Version: 0x010A0006
***
INFO: Little endian host
INFO: found global configuration file global_conf.json, parsing it
INFO: global_conf.json does contain a JSON object named SX1301_conf, parsing SX1301 parameters
INFO: lorawan_public 1, clksrc 1
INFO: antenna_gain 0 dBi
INFO: Configuring TX LUT with 16 indexes
INFO: radio 0 enabled (type SX1257), center frequency 867500000, RSSI offset -164.000000, tx enabled 1
INFO: radio 1 enabled (type SX1257), center frequency 868500000, RSSI offset -164.000000, tx enabled 0
INFO: Lora multi-SF channel 0>  radio 1, IF -400000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 1>  radio 1, IF -200000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 2>  radio 1, IF 0 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 3>  radio 0, IF -400000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 4>  radio 0, IF -200000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 5>  radio 0, IF 0 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 6>  radio 0, IF 200000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora multi-SF channel 7>  radio 0, IF 400000 Hz, 125 kHz bw, SF 7 to 12
INFO: Lora std channel> radio 1, IF -200000 Hz, 250000 Hz bw, SF 7
INFO: FSK channel> radio 1, IF 300000 Hz, 125000 Hz bw, 50000 bps datarate
INFO: global_conf.json does contain a JSON object named gateway_conf, parsing gateway parameters
INFO: gateway MAC address is configured to AA555A0000240409
INFO: server hostname or IP address is configured to "localhost"
INFO: upstream port is configured to "1680"
INFO: downstream port is configured to "1680"
INFO: downstream keep-alive interval is configured to 10 seconds
INFO: statistics display interval is configured to 30 seconds
INFO: upstream PUSH_DATA time-out is configured to 100 ms
INFO: packets received with a valid CRC will be forwarded
INFO: packets received with a CRC error will NOT be forwarded
INFO: packets received with no CRC will NOT be forwarded
INFO: found local configuration file local_conf.json, parsing it
INFO: redefined parameters will overwrite global parameters
INFO: local_conf.json does not contain a JSON object named SX1301_conf
INFO: local_conf.json does contain a JSON object named gateway_conf, parsing gateway parameters
INFO: gateway MAC address is configured to <hidden>
INFO: server hostname or IP address is configured to "router.eu.thethings.network"
INFO: upstream port is configured to "1700"
INFO: downstream port is configured to "1700"
INFO: packets received with a valid CRC will be forwarded
INFO: packets received with a CRC error will NOT be forwarded
INFO: packets received with no CRC will NOT be forwarded
INFO: [down] PULL_ACK received in 51 ms
INFO: [down] PULL_ACK received in 56 ms
INFO: [down] PULL_ACK received in 58 ms

INFO: Received pkt from mote: 26011ACE (fcnt=84Preformatted text0)

JSON up: {"rxpk":[{"tmst":25992764,"chan":0,"rfch":1,"freq":868.100000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":8.8,"rssi":-41,"size":16,"data":"QM4aASaASAMBrLDMhzv+mw=="}]}
INFO: [up] PUSH_ACK received in 57 ms

##### 2018-11-01 00:31:03 GMT #####
### [UPSTREAM] ###
# RF packets received by concentrator: 3
# CRC_OK: 33.33%, CRC_FAIL: 66.67%, NO_CRC: 0.00%
# RF packets forwarded: 1 (16 bytes)
# PUSH_DATA datagrams sent: 1 (196 bytes)
# PUSH_DATA acknowledged: 100.00%
### [DOWNSTREAM] ###
# PULL_DATA sent: 3 (100.00% acknowledged)
# PULL_RESP(onse) datagrams received: 0 (0 bytes)
# RF packets sent to concentrator: 0 (0 bytes)
# TX errors: 0
### [JIT] ###
src/jitqueue.c:448:jit_print_queue(): INFO: [jit] queue is empty
### [GPS] ###
# GPS sync is disabled
##### END #####

JSON up: {"stat":{"time":"2018-11-01 00:31:03 GMT","rxnb":3,"rxok":1,"rxfw":1,"ackr":100.0,"dwnb":0,"txnb":0}}
INFO: [up] PUSH_ACK received in 55 ms
INFO: [down] PULL_ACK received in 57 ms

INFO: Received pkt from mote: 26011ACE (fcnt=841)

JSON up: {"rxpk":[{"tmst":38228572,"chan":1,"rfch":1,"freq":868.300000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":8.2,"rssi":-65,"size":16,"data":"QM4aASaASQMB+Ippj4C6DA=="}]}
INFO: [up] PUSH_ACK received in 52 ms
INFO: [down] PULL_ACK received in 55 ms

INFO: Received pkt from mote: 26011ACE (fcnt=842)

JSON up: {"rxpk":[{"tmst":50464316,"chan":2,"rfch":1,"freq":868.500000,"stat":1,"modu":"LORA","datr":"SF7BW125","codr":"4/5","lsnr":5.5,"rssi":-64,"size":16,"data":"QM4aASaASgMByGJhP4rY7g=="}]}
INFO: [up] PUSH_ACK received in 68 ms
INFO: [down] PULL_ACK received in 56 ms
INFO: host/sx1301 time offset=(1541032230s:361669µs) - drift=2522µs

##### 2018-11-01 00:31:33 GMT #####
### [UPSTREAM] ###
# RF packets received by concentrator: 4
# CRC_OK: 50.00%, CRC_FAIL: 50.00%, NO_CRC: 0.00%
# RF packets forwarded: 2 (32 bytes)
# PUSH_DATA datagrams sent: 3 (505 bytes)
# PUSH_DATA acknowledged: 100.00%
### [DOWNSTREAM] ###
# PULL_DATA sent: 3 (100.00% acknowledged)
# PULL_RESP(onse) datagrams received: 0 (0 bytes)
# RF packets sent to concentrator: 0 (0 bytes)
# TX errors: 0
### [JIT] ###
src/jitqueue.c:448:jit_print_queue(): INFO: [jit] queue is empty
### [GPS] ###
# GPS sync is disabled
##### END #####

JSON up: {"stat":{"time":"2018-11-01 00:31:33 GMT","rxnb":4,"rxok":2,"rxfw":2,"ackr":100.0,"dwnb":0,"txnb":0}}
INFO: [up] PUSH_ACK received in 57 ms
INFO: [down] PULL_ACK received in 54 ms
INFO: [down] PULL_ACK received in 55 ms

Since here the log doesn’t show any activity until the modules start to send in frequencies associated to radio 1.

I’m using it by usb, but I think there is not difference if I connect it by SPI with a Raspberry Pi Zero W.

What can I do?

I’ve just added a tutorial to my blog for this gateway: https://robotzero.one/heltec-lora-gateway-things-network/

Maybe helpful to someone. Let me know if there’s any errors.

I’ll be setting this up as a permanent gateway in the next few weeks and run some range tests.

2 Likes

Did someone compared the receive sensitivity to other gateways? I think the measured 15,5dBm Output power are enough if we look at our local laws…