MySensors Library & Examples  2.3.2-91-gc4565708
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
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 (__RF24CNT + __NRF5ESBCNT + __RFM69CNT + __RFM95CNT + __RS485CNT + _PJONCNT + __SX126xCNT > 1)
315 #error Only one forward link driver can be activated
316 #endif
317 #endif //DOXYGEN
318 
319 // SANITY CHECK
320 #if defined(MY_REPEATER_FEATURE) || defined(MY_GATEWAY_FEATURE)
321 #define MY_TRANSPORT_SANITY_CHECK
322 #endif
323 
324 // TRANSPORT INCLUDES
325 #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)
326 #include "hal/transport/MyTransportHAL.h"
327 #include "core/MyTransport.h"
328 
329 // PARENT CHECK
330 #if defined(MY_PARENT_NODE_IS_STATIC) && (MY_PARENT_NODE_ID == AUTO)
331 #error Parent is static but no parent ID defined, set MY_PARENT_NODE_ID.
332 #endif
333 
334 #if defined(MY_TRANSPORT_DONT_CARE_MODE)
335 #error MY_TRANSPORT_DONT_CARE_MODE is deprecated, set MY_TRANSPORT_WAIT_READY_MS instead!
336 #endif
337 
338 // RAM ROUTING TABLE
339 #ifdef DOXYGEN
340 
346 #define MY_RAM_ROUTING_TABLE_ENABLED
347 #elif defined(MY_RAM_ROUTING_TABLE_FEATURE) && defined(MY_REPEATER_FEATURE)
348 // activate feature based on architecture
349 #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__)
350 #define MY_RAM_ROUTING_TABLE_ENABLED
351 #elif defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_MEGAAVR)
352 #if defined(__avr_atmega1280__) || defined(__avr_atmega1284__) || defined(__avr_atmega2560__) || defined(__avr_attiny3224__) || defined(__avr_attiny3227__)
353 // >4kb, enable it
354 #define MY_RAM_ROUTING_TABLE_ENABLED
355 #else
356 // memory limited, enable with care
357 // #define MY_RAM_ROUTING_TABLE_ENABLED
358 #endif // __avr_atmega1280__, __avr_atmega1284__, __avr_atmega2560__
359 #endif // ARDUINO_ARCH_AVR
360 #endif // DOXYGEN
361 
362 // SOFTSERIAL
363 #if defined(MY_GSM_TX) != defined(MY_GSM_RX)
364 #error Both, MY_GSM_TX and MY_GSM_RX need to be defined when using SoftSerial
365 #endif
366 
367 #if defined(MY_GATEWAY_TINYGSM) && !defined(SerialAT) && (!defined(MY_GSM_TX) || !defined(MY_GSM_RX))
368 #error You need to define either SerialAT or MY_GSM_RX and MY_GSM_TX pins
369 #endif
370 
371 // POWER PIN
372 #ifndef DOXYGEN
373 #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)
374 #define RADIO_CAN_POWER_OFF (true)
375 #else
376 #define RADIO_CAN_POWER_OFF (false)
377 #endif
378 #endif
379 
380 // Transport drivers
381 #if defined(MY_RADIO_RF24)
382 #include "hal/transport/RF24/driver/RF24.cpp"
383 #include "hal/transport/RF24/MyTransportRF24.cpp"
384 #elif defined(MY_RADIO_NRF5_ESB)
385 #if !defined(ARDUINO_ARCH_NRF5)
386 #error No support for nRF5 radio on this platform
387 #endif
388 #include "hal/transport/NRF5_ESB/driver/Radio.cpp"
389 #include "hal/transport/NRF5_ESB/driver/Radio_ESB.cpp"
390 #include "hal/transport/NRF5_ESB/MyTransportNRF5_ESB.cpp"
391 #elif defined(MY_RS485)
392 #if !defined(MY_RS485_HWSERIAL)
393 #if defined(__linux__)
394 #error You must specify MY_RS485_HWSERIAL for RS485 transport
395 #endif
396 #include "drivers/AltSoftSerial/AltSoftSerial.cpp"
397 #endif
398 #include "hal/transport/RS485/MyTransportRS485.cpp"
399 #elif defined(MY_RADIO_RFM69)
400 #if defined(MY_RFM69_NEW_DRIVER)
401 #include "hal/transport/RFM69/driver/new/RFM69_new.cpp"
402 #else
403 #include "hal/transport/RFM69/driver/old/RFM69_old.cpp"
404 #endif
405 #include "hal/transport/RFM69/MyTransportRFM69.cpp"
406 #elif defined(MY_RADIO_RFM95)
407 #include "hal/transport/RFM95/driver/RFM95.cpp"
408 #include "hal/transport/RFM95/MyTransportRFM95.cpp"
409 #elif defined(MY_PJON)
410 #include "hal/transport/PJON/driver/PJON.h"
411 #include "hal/transport/PJON/driver/PJONSoftwareBitBang.h"
412 #if (PJON_BROADCAST == 0)
413 #error "You must change PJON_BROADCAST to BROADCAST_ADDRESS (255u) and PJON_NOT_ASSIGNED to other one."
414 #endif
415 #include "hal/transport/PJON/MyTransportPJON.cpp"
416 #elif defined(MY_RADIO_SX126x)
417 #include "hal/transport/SX126x/driver/SX126x.cpp"
418 #include "hal/transport/SX126x/MyTransportSX126x.cpp"
419 #endif
420 
421 #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))
422 #define MY_TRANSPORT_ENCRYPTION
423 #endif
424 
425 #include "hal/transport/MyTransportHAL.cpp"
426 
427 // PASSIVE MODE
428 #if defined(MY_PASSIVE_NODE) && !defined(DOXYGEN)
429 #define MY_TRANSPORT_UPLINK_CHECK_DISABLED
430 #define MY_PARENT_NODE_IS_STATIC
431 #undef MY_REGISTRATION_FEATURE
432 #undef MY_SIGNING_FEATURE
433 #undef MY_OTA_FIRMWARE_FEATURE
434 #if defined(MY_GATEWAY_FEATURE) || defined(MY_REPEATER_FEATURE)
435 #error This node is configured as GW/repeater, MY_PASSIVE_NODE cannot be set simultaneously
436 #endif
437 #if (MY_NODE_ID == AUTO)
438 #error MY_PASSIVE_NODE configuration requires setting MY_NODE_ID
439 #endif
440 #endif
441 
442 #include "core/MyTransport.cpp"
443 #endif
444 
445 // Make sure to disable child features when parent feature is disabled
446 #if !defined(MY_SENSOR_NETWORK)
447 #undef MY_OTA_FIRMWARE_FEATURE
448 #undef MY_REPEATER_FEATURE
449 #undef MY_SIGNING_NODE_WHITELISTING
450 #undef MY_SIGNING_FEATURE
451 #endif
452 
453 #if !defined(MY_GATEWAY_FEATURE)
454 #undef MY_INCLUSION_MODE_FEATURE
455 #undef MY_INCLUSION_BUTTON_FEATURE
456 #endif
457 
458 #if !defined(MY_CORE_ONLY)
459 #if !defined(MY_GATEWAY_FEATURE) && !defined(MY_SENSOR_NETWORK)
460 #error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
461 #endif
462 #endif
463 
464 #include "core/MyCapabilities.h"
465 #include "core/MyMessage.cpp"
466 #include "core/MyMultiMessage.cpp"
467 #include "core/MySplashScreen.cpp"
468 #include "core/MySensorsCore.cpp"
469 
470 #if defined(MY_DIAGNOSTICS)
471 #include "core/MyDiagnostics.cpp"
472 #endif
473 
474 // HW mains
475 #if defined(ARDUINO_ARCH_AVR)
476 #include "hal/architecture/AVR/MyMainAVR.cpp"
477 #elif defined(ARDUINO_ARCH_MEGAAVR)
478 #include "hal/architecture/AVR/MyMainAVR.cpp"
479 #elif defined(ARDUINO_ARCH_SAMD)
480 #include "hal/architecture/SAMD/MyMainSAMD.cpp"
481 #elif defined(ARDUINO_ARCH_ESP8266)
482 #include "hal/architecture/ESP8266/MyMainESP8266.cpp"
483 #elif defined(ARDUINO_ARCH_NRF5)
484 #include "hal/architecture/NRF5/MyMainNRF5.cpp"
485 #elif defined(ARDUINO_ARCH_ESP32)
486 #include "hal/architecture/ESP32/MyMainESP32.cpp"
487 #elif defined(__linux__)
488 #include "hal/architecture/Linux/MyMainLinuxGeneric.cpp"
489 #elif defined(ARDUINO_ARCH_STM32)
490 #include "hal/architecture/STM32/MyMainSTM32.cpp"
491 #elif defined(__ASR6501__) || defined(__ASR6502__)
492 #include "hal/architecture/ASR650x/MyMainASR650x.cpp"
493 #elif defined(__arm__) && defined(TEENSYDUINO)
494 #include "hal/architecture/Teensy3/MyMainTeensy3.cpp"
495 #elif defined(ARDUINO_ARCH_CUBECELL)
496 #include "hal/architecture/ASR650x/MyMainASR650x.cpp"
497 #endif
498 
499 #endif
500 
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