move all user configurable files to shared dir
This commit is contained in:
1 parent
2deaec1aed
commit
b09934e76e
14 files changed
+77
-75
No files matched your search
+13
-11
@@ -19,12 +19,14 @@ env = DefaultEnvironment()
|
||||
config = configparser.ConfigParser()
|
||||
config.read("platformio.ini")
|
||||
|
||||
# get platformio source path
|
||||
srcdir = env.get("PROJECT_SRC_DIR")
|
||||
# get platformio project directory
|
||||
prjdir = env.get("PROJECT_DIR")
|
||||
|
||||
# get platformio shared path
|
||||
shareddir = os.path.join (prjdir, "shared")
|
||||
|
||||
# get hal path
|
||||
prjdir = env.get("PROJECT_DIR")
|
||||
haldir = os.path.join (prjdir, "shared/hal")
|
||||
haldir = os.path.join (prjdir, "shared\hal")
|
||||
|
||||
# check if hal file is present in source directory
|
||||
halconfig = config.get("board", "halfile")
|
||||
@@ -43,23 +45,23 @@ if os.path.isfile(halconfigfile) and os.access(halconfigfile, os.R_OK):
|
||||
else:
|
||||
sys.exit("Missing file " + halconfigfile + ", please create it! Aborting.")
|
||||
|
||||
# check if lmic config file is present in source directory
|
||||
# check if lmic config file is present in shared directory
|
||||
lmicconfig = config.get("common", "lmicconfigfile")
|
||||
lmicconfigfile = os.path.join (srcdir, lmicconfig)
|
||||
lmicconfigfile = os.path.join (shareddir, lmicconfig)
|
||||
if os.path.isfile(lmicconfigfile) and os.access(lmicconfigfile, os.R_OK):
|
||||
print("Parsing LMIC configuration from " + lmicconfigfile)
|
||||
else:
|
||||
sys.exit("Missing file " + lmicconfigfile + ", please create it! Aborting.")
|
||||
|
||||
# check if lora key file is present in source directory
|
||||
lorakeyfile = os.path.join (srcdir, config.get("common", "lorakeyfile"))
|
||||
# check if lora key file is present in shared directory
|
||||
lorakeyfile = os.path.join (shareddir, config.get("common", "lorakeyfile"))
|
||||
if os.path.isfile(lorakeyfile) and os.access(lorakeyfile, os.R_OK):
|
||||
print("Parsing LORAWAN keys from " + lorakeyfile)
|
||||
else:
|
||||
sys.exit("Missing file " + lorakeyfile + ", please create it! Aborting.")
|
||||
|
||||
# check if ota key file is present in source directory
|
||||
otakeyfile = os.path.join (srcdir, config.get("common", "otakeyfile"))
|
||||
# check if ota key file is present in shared directory
|
||||
otakeyfile = os.path.join (shareddir, config.get("common", "otakeyfile"))
|
||||
if os.path.isfile(otakeyfile) and os.access(otakeyfile, os.R_OK):
|
||||
print("Parsing OTA keys from " + otakeyfile)
|
||||
else:
|
||||
@@ -114,7 +116,7 @@ env.Append(BUILD_FLAGS=[
|
||||
u'-DPAXEXPRESS_REPO=\\"' + mykeys["PAXEXPRESS_REPO"] + '\\"',
|
||||
u'-DPAXEXPRESS_PACKAGE=\\"' + package + '\\"',
|
||||
u'-DARDUINO_LMIC_PROJECT_CONFIG_H=' + lmicconfig,
|
||||
u'-I \"' + srcdir + '\"'
|
||||
u'-I \"' + shareddir + '\"'
|
||||
])
|
||||
|
||||
# function for pushing new firmware to paxexpress storage using API
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
// COUNTRY AND PROJECT SPECIFIC DEFINITIONS FOR LMIC STACK
|
||||
|
||||
// workaround for arduino-espressif32 v2.0.0 (see isse #714 @ MCCI_LMIC)
|
||||
#define hal_init LMICHAL_init
|
||||
|
||||
// COUNTRY SETTINGS
|
||||
// --> please check with you local regulations for ISM band frequency use!
|
||||
|
||||
#define CFG_eu868 1 // Europe (high band)
|
||||
//#define CFG_us915 1 // USA, Canada and South America
|
||||
//#define CFG_in866 1 // India
|
||||
//#define CFG_au915 1 // Australia
|
||||
//#define CFG_as923 1 // Asia
|
||||
//#define CFG_kr920 1 // Korea
|
||||
|
||||
// LMIC LORAWAN STACK SETTINGS
|
||||
// --> adapt to your device only if necessary
|
||||
|
||||
// use interrupts only if LORA_IRQ and LORA_DIO are connected to interrupt
|
||||
// capable and separate GPIO pins on your board, if not don't enable
|
||||
// note: this feature can't be used on ESP32 unless PR #556 of MCCI LMIC was merged
|
||||
//#if (LORA_IRQ) != (LORA_IO1)
|
||||
//#define LMIC_USE_INTERRUPTS 1
|
||||
//#endif
|
||||
|
||||
// avoid lmic warning if we don't configure radio in case we haven't one
|
||||
#if !(defined(CFG_sx1272_radio) || defined(CFG_sx1276_radio))
|
||||
#define CFG_sx1276_radio 1
|
||||
#endif
|
||||
|
||||
// time sync via LoRaWAN network, note: not supported by TTNv2
|
||||
#define LMIC_ENABLE_DeviceTimeReq 1
|
||||
|
||||
// This tells LMIC to make the receive windows bigger, in case your clock is
|
||||
// faster or slower. This causes the transceiver to be earlier switched on,
|
||||
// so consuming more power. You may sharpen (reduce) this value if you are
|
||||
// limited on battery.
|
||||
// ATTN: VALUES > 7 WILL CAUSE RECEPTION AND JOIN PROBLEMS WITH HIGH SF RATES
|
||||
//#define CLOCK_ERROR_PROCENTAGE 5
|
||||
|
||||
// Set this to 1 to enable some basic debug output (using printf) about
|
||||
// RF settings used during transmission and reception. Set to 2 to
|
||||
// enable more verbose output. Make sure that printf is actually
|
||||
// configured (e.g. on AVR it is not by default), otherwise using it can
|
||||
// cause crashing.
|
||||
//#define LMIC_DEBUG_LEVEL 1
|
||||
|
||||
// Enable this to allow using printf() to print to the given serial port
|
||||
// (or any other Print object). This can be easy for debugging. The
|
||||
// current implementation only works on AVR, though.
|
||||
//#define LMIC_PRINTF_TO Serial
|
||||
|
||||
// Change the SPI clock speed if you encounter errors
|
||||
// communicating with the radio.
|
||||
// The standard range is 125kHz-8MHz, but some boards can go faster.
|
||||
//#define LMIC_SPI_FREQ 1E6
|
||||
|
||||
// Any runtime assertion failures are printed to this serial port (or
|
||||
// any other Print object). If this is unset, any failures just silently
|
||||
// halt execution.
|
||||
#define LMIC_FAILURE_TO Serial
|
||||
|
||||
// Uncomment this to disable all code related to joining
|
||||
//#define DISABLE_JOIN
|
||||
// Uncomment this to disable all code related to ping
|
||||
#define DISABLE_PING
|
||||
// Uncomment this to disable all code related to beacon tracking.
|
||||
// Requires ping to be disabled too#define DISABLE_BEACONS
|
||||
|
||||
// Uncomment these to disable the corresponding MAC commands.
|
||||
// Class A
|
||||
//#define DISABLE_MCMD_DCAP_REQ // duty cycle cap
|
||||
//#define DISABLE_MCMD_DN2P_SET // 2nd DN window param
|
||||
//#define DISABLE_MCMD_SNCH_REQ // set new channel
|
||||
// Class B
|
||||
//#define DISABLE_MCMD_PING_SET // set ping freq, automatically disabled by
|
||||
// DISABLE_PING #define DISABLE_MCMD_BCNI_ANS // next beacon start, automatical
|
||||
// disabled by DISABLE_BEACON
|
||||
|
||||
// In LoRaWAN, a gateway applies I/Q inversion on TX, and nodes do the
|
||||
// same on RX. This ensures that gateways can talk to nodes and vice
|
||||
// versa, but gateways will not hear other gateways and nodes will not
|
||||
// hear other nodes. By uncommenting this macro, this inversion is
|
||||
// disabled and this node can hear other nodes. If two nodes both have
|
||||
// this macro set, they can talk to each other (but they can no longer
|
||||
// hear gateways). This should probably only be used when debugging
|
||||
// and/or when talking to the radio directly (e.g. like in the "raw"
|
||||
// example).
|
||||
//#define DISABLE_INVERT_IQ_ON_RX
|
||||
|
||||
// This allows choosing between multiple included AES implementations.
|
||||
// Make sure exactly one of these is uncommented.
|
||||
//
|
||||
// This selects the original AES implementation included LMIC. This
|
||||
// implementation is optimized for speed on 32-bit processors using
|
||||
// fairly big lookup tables, but it takes up big amounts of flash on the
|
||||
// AVR architecture.
|
||||
//#define USE_ORIGINAL_AES
|
||||
//
|
||||
// This selects the AES implementation written by Ideetroon for their
|
||||
// own LoRaWAN library. It also uses lookup tables, but smaller
|
||||
// byte-oriented ones, making it use a lot less flash space (but it is
|
||||
// also about twice as slow as the original).
|
||||
#define USE_IDEETRON_AES
|
||||
//
|
||||
//#define USE_MBEDTLS_AES
|
||||
|
||||
// Define this for devices with external power.
|
||||
//#define LMIC_MCMD_DEVS_BATT_DEFAULT MCMD_DEVS_EXT_POWER
|
||||
@@ -0,0 +1,85 @@
|
||||
#ifndef __LORACONF_H__
|
||||
#define __LORACONF_H__
|
||||
|
||||
#if (HAS_LORA)
|
||||
|
||||
/************************************************************
|
||||
* LMIC LoRaWAN configuration
|
||||
*
|
||||
* Read the values from TTN console (or whatever applies), insert them here,
|
||||
* and rename this file to shared/loraconf.h
|
||||
*
|
||||
* You can configure OTAA or ABP Activation. In order to use ABP, uncomment
|
||||
* (enable) the following line, but you should only do so, if you have good
|
||||
* reasons for not using OTAA.
|
||||
*
|
||||
*************************************************************/
|
||||
|
||||
//#define LORA_ABP
|
||||
|
||||
#ifndef LORA_ABP
|
||||
/************************************************************
|
||||
* OTAA configuration
|
||||
*
|
||||
* DEVEUI, APPEUI and APPKEY should all be specified in MSB format as
|
||||
* displayed in TTN console, so you can cut & paste from there. This is different
|
||||
* from standard LMIC-Arduino which expects DEVEUI and APPEUI in LSB format.
|
||||
* For TTN, APPEUI in MSB format always starts with 0x70, 0xB3, 0xD5.
|
||||
* Set your DEVEUI here, if your device has have a fixed one.
|
||||
* If you leave this untouched, then the DEVEUI will be derived from device's
|
||||
* MAC adress during startup and will be displayed on device's screen as well as
|
||||
* on serial console, if you set 'verbose 1' in paxcounter.conf and
|
||||
* 'debug_level 3' in platformio.ini.
|
||||
* If using a board with Microchip 24AA02E64 Uinique ID for deveui, the DEVEUI
|
||||
* will be overwritten by the one contained in the Microchip module.
|
||||
*
|
||||
************************************************************/
|
||||
|
||||
static const u1_t DEVEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
static const u1_t APPEUI[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
static const u1_t APPKEY[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef LORA_ABP
|
||||
/************************************************************
|
||||
* ABP configuration (for development)
|
||||
*
|
||||
* Get your
|
||||
* - Network Session Key (NWKSKEY)
|
||||
* - App Session Key and your (APPSKEY)
|
||||
* - Device Address (DEVADDR)
|
||||
* from e.g. TTN console and replace the example values below.
|
||||
*
|
||||
* NOTE: Use MSB format (as displayed in TTN console, so you can cut & paste
|
||||
* from there)
|
||||
*
|
||||
* NOTE: You may also need to adjust lorawan_abp.cpp in order to configure
|
||||
* different channels and data rate channels to match your country's regulations
|
||||
* and your network's settings.
|
||||
*
|
||||
************************************************************/
|
||||
|
||||
// ID of LoRaAlliance assigned Network (for a list, see e.g. here
|
||||
// https://www.thethingsnetwork.org/docs/lorawan/prefix-assignments.html)
|
||||
static const u1_t NETID = 0x13; // TTN
|
||||
|
||||
static const u1_t NWKSKEY[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
static const u1_t APPSKEY[16] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00};
|
||||
|
||||
static const u4_t DEVADDR =
|
||||
0x00000000; // <-- Change this address for every node!
|
||||
|
||||
// set additional ABP parameters in loraconf_abp.cpp
|
||||
void setABPParameters();
|
||||
|
||||
#endif
|
||||
|
||||
#endif // HAS_LORA
|
||||
|
||||
#endif // __LORACONF_H__
|
||||
@@ -0,0 +1,8 @@
|
||||
[ota]
|
||||
OTA_WIFI_SSID = MyHomeWifi
|
||||
OTA_WIFI_PASS = FooBar42!
|
||||
|
||||
[paxexpress]
|
||||
PAXEXPRESS_USER = MyPaxexpressUser
|
||||
PAXEXPRESS_REPO = MyPaxexpressRepo
|
||||
PAXEXPRESS_API_TOKEN = 3894a7a51d70c6523c1b7479261c34845ebf7878
|
||||
@@ -0,0 +1,133 @@
|
||||
// clang-format off
|
||||
|
||||
// ----- Paxcounter user config file ------
|
||||
//
|
||||
// --> adapt to your needs and use case <--
|
||||
//
|
||||
// Notes:
|
||||
// 1. After editing, before "build", use "clean" button in PlatformIO!
|
||||
// 2. Clear NVRAM of the board to delete previous stored runtime settings (pio run -t erase)
|
||||
|
||||
// Device options
|
||||
#define VERBOSE 1 // set to 0 to silence the device, 1 enables additional debug output
|
||||
#define BOOTMENU 0 // 0 = no bootmenu, 1 = device brings up boot menu before starting application
|
||||
#define BOOTDELAY 30 // time [seconds] while devices waits in boot menue for input
|
||||
#define BOOTTIMEOUT 300 // time [seconds] while devices waits to finish upload a firmware file
|
||||
#define SDLOGGING 0 // set to 1 for system logging to SD card (if device has one)
|
||||
|
||||
// Payload send cycle and encoding
|
||||
#define SENDCYCLE 30 // payload send cycle [seconds/2], 0 .. 255
|
||||
#define SLEEPCYCLE 0 // sleep time after a send cycle [seconds/10], 0 .. 65535; 0 means no sleep [default = 0]
|
||||
#define PAYLOAD_ENCODER 2 // payload encoder: 1=Plain, 2=Packed, 3=Cayenne LPP dynamic, 4=Cayenne LPP packed
|
||||
#define COUNTERMODE 0 // 0=cyclic, 1=cumulative, 2=cyclic confirmed
|
||||
#define SYNCWAKEUP 300 // shifts sleep wakeup to top-of-hour, when +/- X seconds off [0=off]
|
||||
|
||||
// default settings for transmission of sensor data (first list = data on / second line = data off)
|
||||
#define PAYLOADMASK \
|
||||
((GPS_DATA | MEMS_DATA | COUNT_DATA | SENSOR1_DATA | SENSOR2_DATA | SENSOR3_DATA) & \
|
||||
(~BATT_DATA) & (~RESERVED_DATA))
|
||||
|
||||
// MAC sniffing settings
|
||||
#define BLECOUNTER 0 // set to 0 if you do not want to start the BLE sniffer
|
||||
#define WIFICOUNTER 1 // set to 0 if you do not want to start the WIFI sniffer
|
||||
#define RSSILIMIT 0 // 0...-128, set to 0 if you do not want to filter signals
|
||||
|
||||
// BLE scan parameters
|
||||
#define BLESCANTIME 0 // [seconds] scan duration, 0 means infinite [default], see note below
|
||||
#define BLESCANWINDOW 80 // [milliseconds] scan window, see below, 3 .. 10240, default 80ms
|
||||
#define BLESCANINTERVAL 80 // [illiseconds] scan interval, see below, 3 .. 10240, default 80ms = 100% duty cycle
|
||||
|
||||
/* Note: guide for setting bluetooth parameters
|
||||
*
|
||||
* |< Scan Window > |< Scan Window > | ... |< Scan Window > |
|
||||
* |< Scan Interval >|< Scan Interval >| ... |< Scan Interval >|
|
||||
* |< Scan duration >|
|
||||
*
|
||||
* Scan duration sets how long scanning should be going on, before starting a new scan cycle. 0 means infinite (default).
|
||||
* Scan window sets how much of the interval should be occupied by scanning. Should be >= BLESCANINTERVAL.
|
||||
* Scan interval is how long scanning should be done on each channel. BLE uses 3 channels for advertising.
|
||||
* -> Adjust these values with power consumption in mind if power is limited.
|
||||
* -> Scan interval can be changed during runtime by remote comammand.
|
||||
*/
|
||||
|
||||
// WiFi scan parameters
|
||||
#define WIFI_MY_COUNTRY "01" // select 2-letter locale for Wifi RF settings, e.g. "DE"; use "01" for world safe mode
|
||||
#define WIFI_CHANNEL_SWITCH_INTERVAL 50 // [seconds/100] -> 0,5 sec.
|
||||
#define WIFI_CHANNEL_MAP WIFI_CHANNEL_ALL // possible values see libpax_api.h
|
||||
|
||||
// LoRa payload default parameters
|
||||
#define MEM_LOW 2048 // [Bytes] low memory threshold triggering a send cycle
|
||||
#define RETRANSMIT_RCMD 5 // [seconds] wait time before retransmitting rcommand results
|
||||
#define PAYLOAD_BUFFER_SIZE 51 // maximum size of payload block per transmit
|
||||
#define PAYLOAD_OPENSENSEBOX 0 // send payload compatible to sensebox.de (swap geo position and pax data)
|
||||
#define LORADRDEFAULT 5 // 0 .. 15, LoRaWAN datarate, according to regional LoRaWAN specs [default = 5]
|
||||
#define LORATXPOWDEFAULT 14 // 0 .. 255, LoRaWAN TX power in dBm [default = 14]
|
||||
#define MAXLORARETRY 500 // maximum count of TX retries if LoRa busy
|
||||
#define SEND_QUEUE_SIZE 10 // maximum number of messages in payload send queue [1 = no queue]
|
||||
|
||||
// Hardware settings
|
||||
#define RGBLUMINOSITY 30 // RGB LED luminosity [default = 30%]
|
||||
#define DISPLAYREFRESH_MS 40 // OLED refresh cycle in ms [default = 40] -> 1000/40 = 25 frames per second
|
||||
#define DISPLAYCONTRAST 80 // 0 .. 255, OLED display contrast [default = 80]
|
||||
#define DISPLAYCYCLE 3 // Auto page flip delay in sec [default = 2] for devices without button
|
||||
#define HOMECYCLE 30 // house keeping cycle in seconds [default = 30 secs]
|
||||
|
||||
// Settings for BME680 environmental sensor
|
||||
#define BME_TEMP_OFFSET 5.0f // Offset sensor on chip temp <-> ambient temp [default = 5°C]
|
||||
#define STATE_SAVE_PERIOD UINT32_C(360 * 60 * 1000) // update every 360 minutes = 4 times a day
|
||||
#define BMECYCLE 1 // bme sensor read cycle in seconds [default = 1 secs]
|
||||
|
||||
// OTA settings
|
||||
#define USE_OTA 1 // set to 0 to disable OTA update
|
||||
#define WIFI_MAX_TRY 5 // maximum number of wifi connect attempts for OTA update [default = 20]
|
||||
#define OTA_MAX_TRY 5 // maximum number of attempts for OTA download and write to flash [default = 3]
|
||||
#define OTA_MIN_BATT 50 // minimum battery level for OTA [percent]
|
||||
#define RESPONSE_TIMEOUT_MS 60000 // firmware binary server connection timeout [milliseconds]
|
||||
|
||||
// settings for syncing time of node with a time source (network / gps / rtc / timeserver)
|
||||
#define TIME_SYNC_LORAWAN 1 // set to 1 to use LORA network as time source, 0 means off [default = 1]
|
||||
#define TIME_SYNC_LORASERVER 0 // set to 1 to use LORA timeserver as time source, 0 means off [default = 0]
|
||||
#define TIME_SYNC_INTERVAL 60 // sync time attempt each .. minutes from time source [default = 60], 0 means off
|
||||
#define TIME_SYNC_INTERVAL_RETRY 10 // retry time sync after lost sync each .. minutes [default = 10], 0 means off
|
||||
#define TIME_SYNC_SAMPLES 1 // number of time requests for averaging, max. 255
|
||||
#define TIME_SYNC_CYCLE 60 // delay between two time samples [seconds]
|
||||
#define TIME_SYNC_TIMEOUT 400 // timeout waiting for timeserver answer [seconds]
|
||||
#define TIME_SYNC_COMPILEDATE 0 // set to 1 to use compile date to initialize RTC after power outage [default = 0]
|
||||
#define TIME_SYNC_TIMEZONE "CET-1CEST,M3.4.0/2,M10.4.0/3" // Timezone in POSIX format (example shows Germany/Berlin)
|
||||
|
||||
// Ports on which the device sends and listenes on LoRaWAN and SPI
|
||||
#define COUNTERPORT 1 // counts
|
||||
#define MACPORT 0 // network commands
|
||||
#define RCMDPORT 2 // remote commands
|
||||
#define STATUSPORT 2 // remote command results
|
||||
#define CONFIGPORT 3 // config query results
|
||||
#define GPSPORT 4 // gps - NOTE: set to 1 to send combined GPS+COUNTERPORT payload
|
||||
#define BUTTONPORT 5 // button pressed signal
|
||||
#define RESERVEDPORT 6 // reserved (unused)
|
||||
#define BMEPORT 7 // BME680 sensor
|
||||
#define BATTPORT 8 // battery voltage
|
||||
#define TIMEPORT 9 // time query and response
|
||||
#define SENSOR1PORT 10 // user sensor #1
|
||||
#define SENSOR2PORT 11 // user sensor #2
|
||||
#define SENSOR3PORT 12 // user sensor #3
|
||||
|
||||
// Cayenne LPP Ports, see https://community.mydevices.com/t/cayenne-lpp-2-0/7510
|
||||
#define CAYENNE_LPP1 1 // dynamic sensor payload (LPP 1.0)
|
||||
#define CAYENNE_LPP2 2 // packed sensor payload (LPP 2.0)
|
||||
#define CAYENNE_GPS 3 // full scale GPS payload
|
||||
#define CAYENNE_ACTUATOR 10 // actuator commands
|
||||
#define CAYENNE_DEVICECONFIG 11 // device period configuration
|
||||
#define CAYENNE_SENSORREAD 13 // sensor period configuration
|
||||
#define CAYENNE_SENSORENABLE 14 // sensor enable configuration
|
||||
|
||||
// MQTT settings, only needed if MQTT is used (#define HAS_MQTT in board hal file)
|
||||
#define MQTT_ETHERNET 1 // select PHY: set 0 for Wifi, 1 for ethernet (Wifi not yet implemented!)
|
||||
#define MQTT_INTOPIC "paxin"
|
||||
#define MQTT_OUTTOPIC "paxout"
|
||||
#define MQTT_PORT 1883
|
||||
#define MQTT_SERVER "public.cloud.shiftr.io"
|
||||
#define MQTT_USER "public"
|
||||
#define MQTT_PASSWD "public"
|
||||
#define MQTT_RETRYSEC 20 // retry reconnect every 20 seconds
|
||||
#define MQTT_KEEPALIVE 10 // keep alive interval in seconds
|
||||
//#define MQTT_CLIENTNAME "my_paxcounter" // generated by default
|
||||
Reference in new issue
Block a user