MySensors Library & Examples
2.3.2-96-g79dfe0a1
MySensors.h
Go to the documentation of this file.
1
/*
2
* The MySensors Arduino library handles the wireless radio link and protocol
3
* between your home built sensors/actuators and HA controller of choice.
4
* The sensors forms a self healing radio network with optional repeaters. Each
5
* repeater and gateway builds a routing tables in EEPROM which keeps track of the
6
* network topology allowing messages to be routed to nodes.
7
*
8
* Created by Henrik Ekblad <
[email protected]
>
9
* Copyright (C) 2013-2026 Sensnology AB
10
* Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors
11
*
12
* Documentation: http://www.mysensors.org
13
* Support Forum: http://forum.mysensors.org
14
*
15
* This program is free software; you can redistribute it and/or
16
* modify it under the terms of the GNU General Public License
17
* version 2 as published by the Free Software Foundation.
18
*/
19
35
#ifndef MySensors_h
36
#define MySensors_h
37
38
#ifdef __cplusplus
39
#include <Arduino.h>
40
#endif
41
#include <stdint.h>
42
43
#if defined(MY_DIAGNOSTICS)
44
#if !defined(ARDUINO_ARCH_AVR)
45
// more flash available
46
#define MY_DIAGNOSTICS_CRYPTO
47
#endif
48
#define MY_DEBUG_VERBOSE_TRANSPORT
49
#define MY_DEBUG_VERBOSE_TRANSPORT_HAL
50
#define MY_SPECIAL_DEBUG
51
#include "core/MyDiagnostics.h"
52
#endif
53
54
#include "
MyConfig.h
"
55
#include "core/MyHelperFunctions.cpp"
56
#include "core/MySplashScreen.h"
57
#include "
core/MySensorsCore.h
"
58
59
// OTA Debug, has to be defined before HAL
60
#if defined(MY_OTA_LOG_SENDER_FEATURE) || defined(MY_OTA_LOG_RECEIVER_FEATURE)
61
#include "
core/MyOTALogging.h
"
62
#endif
63
64
// HARDWARE
65
#include "
hal/architecture/MyHwHAL.h
"
66
#include "hal/crypto/MyCryptoHAL.h"
67
#if defined(ARDUINO_ARCH_ESP8266)
68
#include "hal/architecture/ESP8266/MyHwESP8266.cpp"
69
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
70
#elif defined(ARDUINO_ARCH_ESP32)
71
#include "hal/architecture/ESP32/MyHwESP32.cpp"
72
#include "hal/crypto/ESP32/MyCryptoESP32.cpp"
73
#elif defined(ARDUINO_ARCH_AVR)
74
#include "hal/architecture/AVR/MyHwAVR.cpp"
75
#include "hal/crypto/AVR/MyCryptoAVR.cpp"
76
#elif defined(ARDUINO_ARCH_MEGAAVR)
77
#include "hal/architecture/AVR/MyHwMegaAVR.cpp"
78
#include "hal/crypto/AVR/MyCryptoAVR.cpp"
79
#elif defined(ARDUINO_ARCH_SAMD)
80
#include "drivers/extEEPROM/extEEPROM.cpp"
81
#include "hal/architecture/SAMD/MyHwSAMD.cpp"
82
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
83
#elif defined(ARDUINO_ARCH_STM32)
84
#include "hal/architecture/STM32/MyHwSTM32.cpp"
85
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
86
#elif defined(ARDUINO_ARCH_NRF5) || defined(ARDUINO_ARCH_NRF52)
87
#include "hal/architecture/NRF5/MyHwNRF5.cpp"
88
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
89
#elif defined(__arm__) && defined(TEENSYDUINO)
90
#include "hal/architecture/Teensy3/MyHwTeensy3.cpp"
91
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
92
#elif defined(__ASR6501__) || defined (__ASR6502__)
93
#include "hal/architecture/ASR650x/MyHwASR650x.cpp"
94
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
95
#elif defined(__linux__)
96
#include "hal/architecture/Linux/MyHwLinuxGeneric.cpp"
97
#include "hal/crypto/generic/MyCryptoGeneric.cpp"
98
#else
99
#error Hardware abstraction not defined (unsupported platform)
100
#endif
101
102
#include "hal/architecture/MyHwHAL.cpp"
103
104
// commonly used macros, sometimes missing in arch definitions
105
#if !defined(_BV)
106
#define _BV(x) (1<<(x))
107
#endif
108
109
#if !defined(min) && !defined(__linux__) && !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_ESP32)
110
#define min(a,b) ((a)<(b)?(a):(b))
111
#endif
112
113
#if !defined(max) && !defined(__linux__) && !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_ESP32)
114
#define max(a,b) ((a)>(b)?(a):(b))
115
#endif
116
117
#if !defined(MIN)
118
#define MIN min
119
#endif
120
121
#if !defined(MAX)
122
#define MAX max
123
#endif
124
125
// OTA Debug second part, depends on HAL
126
#if defined(MY_OTA_LOG_SENDER_FEATURE) || defined(MY_OTA_LOG_RECEIVER_FEATURE)
127
#include "core/MyOTALogging.cpp"
128
#endif
129
130
#if defined(MY_LEDS_BLINKING_FEATURE)
131
#error MY_LEDS_BLINKING_FEATURE is now removed from MySensors core,\
132
define MY_DEFAULT_ERR_LED_PIN, MY_DEFAULT_TX_LED_PIN or\
133
MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs
134
#endif
135
136
#if defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
137
#include "core/MyLeds.cpp"
138
#else
139
#include "core/MyLeds.h"
140
#endif
141
142
#include "core/MyIndication.cpp"
143
144
145
// INCLUSION MODE
146
#if defined(MY_INCLUSION_MODE_FEATURE)
147
#include "core/MyInclusionMode.cpp"
148
#endif
149
150
151
// SIGNING
152
#include "core/MySigning.cpp"
153
#if defined(MY_SIGNING_FEATURE)
154
// SIGNING COMMON FUNCTIONS
155
#if defined(MY_SIGNING_ATSHA204) && defined(MY_SIGNING_SOFT)
156
#error Only one signing engine can be activated
157
#endif
158
#if defined(MY_SIGNING_ATSHA204) && defined(__linux__)
159
#error No support for ATSHA204 on this platform
160
#endif
161
162
#if defined(MY_SIGNING_ATSHA204)
163
#include "core/MySigningAtsha204.cpp"
164
#include "drivers/ATSHA204/ATSHA204.cpp"
165
#elif defined(MY_SIGNING_SOFT)
166
#include "core/MySigningAtsha204Soft.cpp"
167
#endif
168
#endif
169
170
// FLASH
171
#if defined(MY_OTA_FIRMWARE_FEATURE)
172
#ifndef MCUBOOT_PRESENT
173
#if defined(MY_OTA_USE_I2C_EEPROM)
174
#include "drivers/I2CEeprom/I2CEeprom.cpp"
175
#else
176
#include "drivers/SPIFlash/SPIFlash.cpp"
177
#endif
178
#endif
179
#include "core/MyOTAFirmwareUpdate.cpp"
180
#endif
181
182
// GATEWAY - TRANSPORT
183
#if defined(MY_CONTROLLER_IP_ADDRESS) || defined(MY_CONTROLLER_URL_ADDRESS)
184
#define MY_GATEWAY_CLIENT_MODE
185
#endif
186
187
#if defined(MY_USE_UDP) && !defined(MY_GATEWAY_CLIENT_MODE)
188
#error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS for UDP
189
#endif
190
191
192
193
// Set MQTT defaults if not set
194
195
#if !defined(MY_MQTT_PUBLISH_TOPIC_PREFIX)
196
#define MY_MQTT_PUBLISH_TOPIC_PREFIX "mygateway1-out"
197
#endif
198
199
#if !defined(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX)
200
#define MY_MQTT_SUBSCRIBE_TOPIC_PREFIX "mygateway1-in"
201
#endif
202
203
#if !defined(MY_MQTT_CLIENT_ID)
204
#define MY_MQTT_CLIENT_ID "mysensors-1"
205
#endif
206
207
#if defined(MY_GATEWAY_MQTT_CLIENT)
208
#if defined(MY_SENSOR_NETWORK)
209
// We assume that a gateway having a radio also should act as repeater
210
#define MY_REPEATER_FEATURE
211
#endif
212
213
// GATEWAY - COMMON FUNCTIONS
214
// We support MQTT Client using W5100, ESP8266, GSM modems supported by TinyGSM library and Linux
215
#if !defined(MY_GATEWAY_CLIENT_MODE) && !defined(MY_GATEWAY_TINYGSM)
216
#error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS
217
#endif
218
219
#if defined(MY_GATEWAY_TINYGSM) && !defined(MY_GATEWAY_MQTT_CLIENT)
220
// TinyGSM currently only supports MQTTClient mode.
221
#error MY_GATEWAY_TINYGSM only works with MY_GATEWAY_MQTT_CLIENT
222
#endif
223
224
#include "core/MyGatewayTransport.cpp"
225
#include "core/MyProtocol.cpp"
226
227
#if defined(MY_GATEWAY_TINYGSM)
228
#include "drivers/TinyGSM/TinyGsmClient.h"
229
#endif
230
231
#if defined(MY_GATEWAY_LINUX)
232
#include "hal/architecture/Linux/drivers/core/EthernetClient.h"
233
#include "hal/architecture/Linux/drivers/core/EthernetServer.h"
234
#include "hal/architecture/Linux/drivers/core/IPAddress.h"
235
#endif
236
#include "drivers/PubSubClient/PubSubClient.cpp"
237
#include "core/MyGatewayTransportMQTTClient.cpp"
238
#elif defined(MY_GATEWAY_FEATURE)
239
// GATEWAY - COMMON FUNCTIONS
240
#include "core/MyGatewayTransport.cpp"
241
#include "core/MyProtocol.cpp"
242
243
// GATEWAY - CONFIGURATION
244
#if defined(MY_SENSOR_NETWORK)
245
// We assume that a gateway having a radio also should act as repeater
246
#define MY_REPEATER_FEATURE
247
#endif
248
249
#if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32)
250
// GATEWAY - ESP8266 / ESP32
251
#include "core/MyGatewayTransportEthernet.cpp"
252
#elif defined(MY_GATEWAY_LINUX)
253
// GATEWAY - Generic Linux
254
#if defined(MY_USE_UDP)
255
#error UDP mode is not available for Linux
256
#endif
257
#include "hal/architecture/Linux/drivers/core/EthernetClient.h"
258
#include "hal/architecture/Linux/drivers/core/EthernetServer.h"
259
#include "hal/architecture/Linux/drivers/core/IPAddress.h"
260
#include "core/MyGatewayTransportEthernet.cpp"
261
#elif defined(MY_GATEWAY_W5100)
262
// GATEWAY - W5100
263
#include "core/MyGatewayTransportEthernet.cpp"
264
#elif defined(MY_GATEWAY_ENC28J60)
265
// GATEWAY - ENC28J60
266
#if defined(MY_USE_UDP)
267
#error UDP mode is not available for ENC28J60
268
#endif
269
#include "core/MyGatewayTransportEthernet.cpp"
270
#elif defined(MY_GATEWAY_SERIAL)
271
// GATEWAY - SERIAL
272
#include "core/MyGatewayTransportSerial.cpp"
273
#endif
274
#endif
275
276
// TRANSPORT
277
#ifndef DOXYGEN
278
// count enabled transports
279
#if defined(MY_RADIO_RF24)
280
#define __RF24CNT 1
281
#else
282
#define __RF24CNT 0
283
#endif
284
#if defined(MY_RADIO_NRF5_ESB)
285
#define __NRF5ESBCNT 1
286
#else
287
#define __NRF5ESBCNT 0
288
#endif
289
#if defined(MY_RADIO_RFM69)
290
#define __RFM69CNT 1
291
#else
292
#define __RFM69CNT 0
293
#endif
294
#if defined(MY_RADIO_RFM95)
295
#define __RFM95CNT 1
296
#else
297
#define __RFM95CNT 0
298
#endif
299
#if defined(MY_RS485)
300
#define __RS485CNT 1
301
#else
302
#define __RS485CNT 0
303
#endif
304
#if defined(MY_PJON)
305
#define _PJONCNT 1
306
#else
307
#define _PJONCNT 0
308
#endif
309
#if defined(MY_RADIO_SX126x)
310
#define __SX126xCNT 1
311
#else
312
#define __SX126xCNT 0
313
#endif
314
#if defined(MY_RADIO_CC1101)
315
#define __CC1101CNT 1
316
#else
317
#define __CC1101CNT 0
318
#endif
319
#if (__RF24CNT + __NRF5ESBCNT + __RFM69CNT + __RFM95CNT + __RS485CNT + _PJONCNT + __SX126xCNT + __CC1101CNT > 1)
320
#error Only one forward link driver can be activated
321
#endif
322
#endif //DOXYGEN
323
324
// SANITY CHECK
325
#if defined(MY_REPEATER_FEATURE) || defined(MY_GATEWAY_FEATURE)
326
#define MY_TRANSPORT_SANITY_CHECK
327
#endif
328
329
// TRANSPORT INCLUDES
330
#if defined(MY_RADIO_RF24) || defined(MY_RADIO_NRF5_ESB) || defined(MY_RADIO_RFM69) || defined(MY_RADIO_RFM95) || defined(MY_RS485) || defined (MY_PJON) || defined(MY_RADIO_SX126x) || defined(MY_RADIO_CC1101)
331
#include "hal/transport/MyTransportHAL.h"
332
#include "
core/MyTransport.h
"
333
334
// PARENT CHECK
335
#if defined(MY_PARENT_NODE_IS_STATIC) && (MY_PARENT_NODE_ID == AUTO)
336
#error Parent is static but no parent ID defined, set MY_PARENT_NODE_ID.
337
#endif
338
339
#if defined(MY_TRANSPORT_DONT_CARE_MODE)
340
#error MY_TRANSPORT_DONT_CARE_MODE is deprecated, set MY_TRANSPORT_WAIT_READY_MS instead!
341
#endif
342
343
// RAM ROUTING TABLE
344
#ifdef DOXYGEN
345
351
#define MY_RAM_ROUTING_TABLE_ENABLED
352
#elif defined(MY_RAM_ROUTING_TABLE_FEATURE) && defined(MY_REPEATER_FEATURE)
353
// activate feature based on architecture
354
#if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_NRF5) || defined(ARDUINO_ARCH_STM32) || defined(TEENSYDUINO) || defined(__linux__) || defined(__ASR6501__) || defined (__ASR6502__)
355
#define MY_RAM_ROUTING_TABLE_ENABLED
356
#elif defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
357
#if defined(__avr_atmega1280__) || defined(__avr_atmega1284__) || defined(__avr_atmega2560__) || defined(__avr_attiny3224__) || defined(__avr_attiny3227__)
358
// >4kb, enable it
359
#define MY_RAM_ROUTING_TABLE_ENABLED
360
#else
361
// memory limited, enable with care
362
// #define MY_RAM_ROUTING_TABLE_ENABLED
363
#endif // __avr_atmega1280__, __avr_atmega1284__, __avr_atmega2560__
364
#endif // ARDUINO_ARCH_AVR
365
#endif // DOXYGEN
366
367
// SOFTSERIAL
368
#if defined(MY_GSM_TX) != defined(MY_GSM_RX)
369
#error Both, MY_GSM_TX and MY_GSM_RX need to be defined when using SoftSerial
370
#endif
371
372
#if defined(MY_GATEWAY_TINYGSM) && !defined(SerialAT) && (!defined(MY_GSM_TX) || !defined(MY_GSM_RX))
373
#error You need to define either SerialAT or MY_GSM_RX and MY_GSM_TX pins
374
#endif
375
376
// POWER PIN
377
#ifndef DOXYGEN
378
#if defined(MY_RF24_POWER_PIN) || defined(MY_RFM69_POWER_PIN) || defined(MY_RFM95_POWER_PIN) || defined(MY_RADIO_NRF5_ESB) || defined(MY_RADIO_SX126x_POWER_PIN)
379
#define RADIO_CAN_POWER_OFF (true)
380
#else
381
#define RADIO_CAN_POWER_OFF (false)
382
#endif
383
#endif
384
385
// Transport drivers
386
#if defined(MY_RADIO_RF24)
387
#include "hal/transport/RF24/driver/RF24.cpp"
388
#include "hal/transport/RF24/MyTransportRF24.cpp"
389
#elif defined(MY_RADIO_NRF5_ESB)
390
#if !defined(ARDUINO_ARCH_NRF5)
391
#error No support for nRF5 radio on this platform
392
#endif
393
#include "hal/transport/NRF5_ESB/driver/Radio.cpp"
394
#include "hal/transport/NRF5_ESB/driver/Radio_ESB.cpp"
395
#include "hal/transport/NRF5_ESB/MyTransportNRF5_ESB.cpp"
396
#elif defined(MY_RS485)
397
#if !defined(MY_RS485_HWSERIAL)
398
#if defined(__linux__)
399
#error You must specify MY_RS485_HWSERIAL for RS485 transport
400
#endif
401
#include "drivers/AltSoftSerial/AltSoftSerial.cpp"
402
#endif
403
#include "hal/transport/RS485/MyTransportRS485.cpp"
404
#elif defined(MY_RADIO_RFM69)
405
#if defined(MY_RFM69_NEW_DRIVER)
406
#include "hal/transport/RFM69/driver/new/RFM69_new.cpp"
407
#else
408
#include "hal/transport/RFM69/driver/old/RFM69_old.cpp"
409
#endif
410
#include "hal/transport/RFM69/MyTransportRFM69.cpp"
411
#elif defined(MY_RADIO_RFM95)
412
#include "hal/transport/RFM95/driver/RFM95.cpp"
413
#include "hal/transport/RFM95/MyTransportRFM95.cpp"
414
#elif defined(MY_PJON)
415
#include "hal/transport/PJON/driver/PJON.h"
416
#include "hal/transport/PJON/driver/PJONSoftwareBitBang.h"
417
#if (PJON_BROADCAST == 0)
418
#error "You must change PJON_BROADCAST to BROADCAST_ADDRESS (255u) and PJON_NOT_ASSIGNED to other one."
419
#endif
420
#include "hal/transport/PJON/MyTransportPJON.cpp"
421
#elif defined(MY_RADIO_SX126x)
422
#include "hal/transport/SX126x/driver/SX126x.cpp"
423
#include "hal/transport/SX126x/MyTransportSX126x.cpp"
424
#elif defined(MY_RADIO_CC1101)
425
#include "hal/transport/CC1101/driver/CC1101.cpp"
426
#include "hal/transport/CC1101/MyTransportCC1101.cpp"
427
#endif
428
429
#if (defined(MY_RF24_ENABLE_ENCRYPTION) && defined(MY_RADIO_RF24)) || (defined(MY_NRF5_ESB_ENABLE_ENCRYPTION) && defined(MY_RADIO_NRF5_ESB)) || (defined(MY_RFM69_ENABLE_ENCRYPTION) && defined(MY_RADIO_RFM69)) || (defined(MY_RFM95_ENABLE_ENCRYPTION) && defined(MY_RADIO_RFM95))
430
#define MY_TRANSPORT_ENCRYPTION
431
#endif
432
433
#include "hal/transport/MyTransportHAL.cpp"
434
435
// PASSIVE MODE
436
#if defined(MY_PASSIVE_NODE) && !defined(DOXYGEN)
437
#define MY_TRANSPORT_UPLINK_CHECK_DISABLED
438
#define MY_PARENT_NODE_IS_STATIC
439
#undef MY_REGISTRATION_FEATURE
440
#undef MY_SIGNING_FEATURE
441
#undef MY_OTA_FIRMWARE_FEATURE
442
#if defined(MY_GATEWAY_FEATURE) || defined(MY_REPEATER_FEATURE)
443
#error This node is configured as GW/repeater, MY_PASSIVE_NODE cannot be set simultaneously
444
#endif
445
#if (MY_NODE_ID == AUTO)
446
#error MY_PASSIVE_NODE configuration requires setting MY_NODE_ID
447
#endif
448
#endif
449
450
#include "core/MyTransport.cpp"
451
#endif
452
453
// Make sure to disable child features when parent feature is disabled
454
#if !defined(MY_SENSOR_NETWORK)
455
#undef MY_OTA_FIRMWARE_FEATURE
456
#undef MY_REPEATER_FEATURE
457
#undef MY_SIGNING_NODE_WHITELISTING
458
#undef MY_SIGNING_FEATURE
459
#endif
460
461
#if !defined(MY_GATEWAY_FEATURE)
462
#undef MY_INCLUSION_MODE_FEATURE
463
#undef MY_INCLUSION_BUTTON_FEATURE
464
#endif
465
466
#if !defined(MY_CORE_ONLY)
467
#if !defined(MY_GATEWAY_FEATURE) && !defined(MY_SENSOR_NETWORK)
468
#error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
469
#endif
470
#endif
471
472
#include "
core/MyCapabilities.h
"
473
#include "core/MyMessage.cpp"
474
#include "core/MyMultiMessage.cpp"
475
#include "core/MySplashScreen.cpp"
476
#include "core/MySensorsCore.cpp"
477
478
#if defined(MY_DIAGNOSTICS)
479
#include "core/MyDiagnostics.cpp"
480
#endif
481
482
// HW mains
483
#if defined(ARDUINO_ARCH_AVR)
484
#include "hal/architecture/AVR/MyMainAVR.cpp"
485
#elif defined(ARDUINO_ARCH_MEGAAVR)
486
#include "hal/architecture/AVR/MyMainAVR.cpp"
487
#elif defined(ARDUINO_ARCH_SAMD)
488
#include "hal/architecture/SAMD/MyMainSAMD.cpp"
489
#elif defined(ARDUINO_ARCH_ESP8266)
490
#include "hal/architecture/ESP8266/MyMainESP8266.cpp"
491
#elif defined(ARDUINO_ARCH_NRF5)
492
#include "hal/architecture/NRF5/MyMainNRF5.cpp"
493
#elif defined(ARDUINO_ARCH_ESP32)
494
#include "hal/architecture/ESP32/MyMainESP32.cpp"
495
#elif defined(__linux__)
496
#include "hal/architecture/Linux/MyMainLinuxGeneric.cpp"
497
#elif defined(ARDUINO_ARCH_STM32)
498
#include "hal/architecture/STM32/MyMainSTM32.cpp"
499
#elif defined(__ASR6501__) || defined(__ASR6502__)
500
#include "hal/architecture/ASR650x/MyMainASR650x.cpp"
501
#elif defined(__arm__) && defined(TEENSYDUINO)
502
#include "hal/architecture/Teensy3/MyMainTeensy3.cpp"
503
#elif defined(ARDUINO_ARCH_CUBECELL)
504
#include "hal/architecture/ASR650x/MyMainASR650x.cpp"
505
#endif
506
507
#endif
508
MyConfig.h
MySensors specific configuration flags.Set these in your sketch before including MySensors....
MyHwHAL.h
MyTransport.h
MySensorsCore.h
MyOTALogging.h
API declaration for MyOTALogging.
MyCapabilities.h
Copyright (C) 2013-2026 Sensnology AB. Generated by
doxygen
1.8.17