Smart-Home am Beispiel der Präsenzerkennung im Raum Projektarbeit Lennart Heimbs, Johannes Krug, Sebastian Dohle und Kevin Holzschuh bei Prof. Oliver Hofmann SS2019
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MySensors.h 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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 <henrik.ekblad@mysensors.org>
  9. * Copyright (C) 2013-2018 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. /**
  20. * @defgroup MySensorsgrp MySensors
  21. * @ingroup publics
  22. * @{
  23. * @brief The primary public API declaration for the MySensors library
  24. */
  25. /**
  26. * @file MySensors.h
  27. *
  28. * @brief API declaration for MySensors
  29. *
  30. * Include this header into your sketch to include the MySensors library and harness the power of
  31. * all those sensors!
  32. */
  33. #ifndef MySensors_h
  34. #define MySensors_h
  35. #ifdef __cplusplus
  36. #include <Arduino.h>
  37. #endif
  38. #include "MyConfig.h"
  39. #include "core/MySplashScreen.h"
  40. #include "core/MySensorsCore.h"
  41. // OTA Debug, has to be defined before HAL
  42. #if defined(MY_OTA_LOG_SENDER_FEATURE) || defined(MY_OTA_LOG_RECEIVER_FEATURE)
  43. #include "core/MyOTALogging.h"
  44. #endif
  45. // HARDWARE
  46. #include "hal/architecture/MyHwHAL.h"
  47. #include "hal/crypto/MyCryptoHAL.h"
  48. #if defined(ARDUINO_ARCH_ESP8266)
  49. #include "hal/architecture/ESP8266/MyHwESP8266.cpp"
  50. #include "hal/crypto/generic/MyCryptoGeneric.cpp"
  51. #elif defined(ARDUINO_ARCH_ESP32)
  52. #include "hal/architecture/ESP32/MyHwESP32.cpp"
  53. #include "hal/crypto/ESP32/MyCryptoESP32.cpp"
  54. #elif defined(ARDUINO_ARCH_AVR)
  55. #include "hal/architecture/AVR/drivers/DigitalWriteFast/digitalWriteFast.h"
  56. #include "hal/architecture/AVR/MyHwAVR.cpp"
  57. #include "hal/crypto/AVR/MyCryptoAVR.cpp"
  58. #elif defined(ARDUINO_ARCH_SAMD)
  59. #include "drivers/extEEPROM/extEEPROM.cpp"
  60. #include "hal/architecture/SAMD/MyHwSAMD.cpp"
  61. #include "hal/crypto/generic/MyCryptoGeneric.cpp"
  62. #elif defined(ARDUINO_ARCH_STM32F1)
  63. #include "hal/architecture/STM32F1/MyHwSTM32F1.cpp"
  64. #include "hal/crypto/generic/MyCryptoGeneric.cpp"
  65. #elif defined(ARDUINO_ARCH_NRF5) || defined(ARDUINO_ARCH_NRF52)
  66. #include "drivers/NVM/VirtualPage.cpp"
  67. #include "drivers/NVM/NVRAM.cpp"
  68. #include "hal/architecture/NRF5/MyHwNRF5.cpp"
  69. #include "hal/crypto/generic/MyCryptoGeneric.cpp"
  70. #elif defined(__arm__) && defined(TEENSYDUINO)
  71. #include "hal/architecture/Teensy3/MyHwTeensy3.cpp"
  72. #include "hal/crypto/generic/MyCryptoGeneric.cpp"
  73. #elif defined(__linux__)
  74. #include "hal/architecture/Linux/MyHwLinuxGeneric.cpp"
  75. #include "hal/crypto/generic/MyCryptoGeneric.cpp"
  76. #else
  77. #error Hardware abstraction not defined (unsupported platform)
  78. #endif
  79. // commonly used macros, sometimes missing in arch definitions
  80. #if !defined(_BV)
  81. #define _BV(x) (1<<(x)) //!< _BV
  82. #endif
  83. #if !defined(min) && !defined(__linux__)
  84. #define min(a,b) ((a)<(b)?(a):(b)) //!< min
  85. #endif
  86. #if !defined(max) && !defined(__linux__)
  87. #define max(a,b) ((a)>(b)?(a):(b)) //!< max
  88. #endif
  89. #if !defined(MIN)
  90. #define MIN min //!< MIN
  91. #endif
  92. #if !defined(MAX)
  93. #define MAX max //!< MAX
  94. #endif
  95. // OTA Debug second part, depends on HAL
  96. #if defined(MY_OTA_LOG_SENDER_FEATURE) || defined(MY_OTA_LOG_RECEIVER_FEATURE)
  97. #include "core/MyOTALogging.cpp"
  98. #endif
  99. #if defined(MY_LEDS_BLINKING_FEATURE)
  100. #error MY_LEDS_BLINKING_FEATURE is now removed from MySensors core,\
  101. define MY_DEFAULT_ERR_LED_PIN, MY_DEFAULT_TX_LED_PIN or\
  102. MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs
  103. #endif
  104. #if defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
  105. #include "core/MyLeds.cpp"
  106. #else
  107. #include "core/MyLeds.h"
  108. #endif
  109. #include "core/MyIndication.cpp"
  110. // INCLUSION MODE
  111. #if defined(MY_INCLUSION_MODE_FEATURE)
  112. #include "core/MyInclusionMode.cpp"
  113. #endif
  114. // SIGNING
  115. #include "core/MySigning.cpp"
  116. #if defined(MY_SIGNING_FEATURE)
  117. // SIGNING COMMON FUNCTIONS
  118. #if defined(MY_SIGNING_ATSHA204) && defined(MY_SIGNING_SOFT)
  119. #error Only one signing engine can be activated
  120. #endif
  121. #if defined(MY_SIGNING_ATSHA204) && defined(__linux__)
  122. #error No support for ATSHA204 on this platform
  123. #endif
  124. #if defined(MY_SIGNING_ATSHA204)
  125. #include "core/MySigningAtsha204.cpp"
  126. #include "drivers/ATSHA204/ATSHA204.cpp"
  127. #elif defined(MY_SIGNING_SOFT)
  128. #include "core/MySigningAtsha204Soft.cpp"
  129. #endif
  130. #endif
  131. // FLASH
  132. #if defined(MY_OTA_FIRMWARE_FEATURE)
  133. #ifndef MCUBOOT_PRESENT
  134. #if defined(MY_OTA_USE_I2C_EEPROM)
  135. #include "drivers/I2CEeprom/I2CEeprom.cpp"
  136. #else
  137. #include "drivers/SPIFlash/SPIFlash.cpp"
  138. #endif
  139. #endif
  140. #include "core/MyOTAFirmwareUpdate.cpp"
  141. #endif
  142. // GATEWAY - TRANSPORT
  143. #if defined(MY_CONTROLLER_IP_ADDRESS) || defined(MY_CONTROLLER_URL_ADDRESS)
  144. #define MY_GATEWAY_CLIENT_MODE //!< gateway client mode
  145. #endif
  146. #if defined(MY_USE_UDP) && !defined(MY_GATEWAY_CLIENT_MODE)
  147. #error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS for UDP
  148. #endif
  149. #if defined(MY_GATEWAY_MQTT_CLIENT)
  150. #if defined(MY_SENSOR_NETWORK)
  151. // We assume that a gateway having a radio also should act as repeater
  152. #define MY_REPEATER_FEATURE
  153. #endif
  154. // GATEWAY - COMMON FUNCTIONS
  155. // We support MQTT Client using W5100, ESP8266, GSM modems supported by TinyGSM library and Linux
  156. #if !defined(MY_GATEWAY_CLIENT_MODE) && !defined(MY_GATEWAY_TINYGSM)
  157. #error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS
  158. #endif
  159. #if defined(MY_GATEWAY_TINYGSM) && !defined(MY_GATEWAY_MQTT_CLIENT)
  160. // TinyGSM currently only supports MQTTClient mode.
  161. #error MY_GATEWAY_TINYGSM only works with MY_GATEWAY_MQTT_CLIENT
  162. #endif
  163. #if !defined(MY_MQTT_PUBLISH_TOPIC_PREFIX)
  164. #error You must specify a topic publish prefix MY_MQTT_PUBLISH_TOPIC_PREFIX for this MQTT client
  165. #endif
  166. #if !defined(MY_MQTT_SUBSCRIBE_TOPIC_PREFIX)
  167. #error You must specify a topic subscribe prefix MY_MQTT_SUBSCRIBE_TOPIC_PREFIX for this MQTT client
  168. #endif
  169. #if !defined(MY_MQTT_CLIENT_ID)
  170. #error You must define a unique MY_MQTT_CLIENT_ID for this MQTT client
  171. #endif
  172. #include "core/MyGatewayTransport.cpp"
  173. #include "core/MyProtocolMySensors.cpp"
  174. #if defined(MY_GATEWAY_TINYGSM)
  175. #include "drivers/TinyGSM/TinyGsmClient.h"
  176. #endif
  177. #if defined(MY_GATEWAY_LINUX)
  178. #include "drivers/Linux/EthernetClient.h"
  179. #include "drivers/Linux/EthernetServer.h"
  180. #include "drivers/Linux/IPAddress.h"
  181. #endif
  182. #include "drivers/PubSubClient/PubSubClient.cpp"
  183. #include "core/MyGatewayTransportMQTTClient.cpp"
  184. #elif defined(MY_GATEWAY_FEATURE)
  185. // GATEWAY - COMMON FUNCTIONS
  186. #include "core/MyGatewayTransport.cpp"
  187. #include "core/MyProtocolMySensors.cpp"
  188. // GATEWAY - CONFIGURATION
  189. #if defined(MY_SENSOR_NETWORK)
  190. // We assume that a gateway having a radio also should act as repeater
  191. #define MY_REPEATER_FEATURE
  192. #endif
  193. #if !defined(MY_PORT)
  194. #error You must define MY_PORT (controller or gateway port to open)
  195. #endif
  196. #if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_ESP32)
  197. // GATEWAY - ESP8266 / ESP32
  198. #include "core/MyGatewayTransportEthernet.cpp"
  199. #elif defined(MY_GATEWAY_LINUX)
  200. // GATEWAY - Generic Linux
  201. #if defined(MY_USE_UDP)
  202. #error UDP mode is not available for Linux
  203. #endif
  204. #include "drivers/Linux/EthernetClient.h"
  205. #include "drivers/Linux/EthernetServer.h"
  206. #include "drivers/Linux/IPAddress.h"
  207. #include "core/MyGatewayTransportEthernet.cpp"
  208. #elif defined(MY_GATEWAY_W5100)
  209. // GATEWAY - W5100
  210. #include "core/MyGatewayTransportEthernet.cpp"
  211. #elif defined(MY_GATEWAY_ENC28J60)
  212. // GATEWAY - ENC28J60
  213. #if defined(MY_USE_UDP)
  214. #error UDP mode is not available for ENC28J60
  215. #endif
  216. #include "core/MyGatewayTransportEthernet.cpp"
  217. #elif defined(MY_GATEWAY_SERIAL)
  218. // GATEWAY - SERIAL
  219. #include "core/MyGatewayTransportSerial.cpp"
  220. #endif
  221. #endif
  222. // TRANSPORT
  223. #ifndef DOXYGEN
  224. // count enabled transports
  225. #if defined(MY_RADIO_RF24)
  226. #define __RF24CNT 1 //!< __RF24CNT
  227. #else
  228. #define __RF24CNT 0 //!< __RF24CNT
  229. #endif
  230. #if defined(MY_RADIO_NRF5_ESB)
  231. #define __NRF5ESBCNT 1 //!< __NRF5ESBCNT
  232. #else
  233. #define __NRF5ESBCNT 0 //!< __NRF5ESBCNT
  234. #endif
  235. #if defined(MY_RADIO_RFM69)
  236. #define __RFM69CNT 1 //!< __RFM69CNT
  237. #else
  238. #define __RFM69CNT 0 //!< __RFM69CNT
  239. #endif
  240. #if defined(MY_RADIO_RFM95)
  241. #define __RFM95CNT 1 //!< __RFM95CNT
  242. #else
  243. #define __RFM95CNT 0 //!< __RFM95CNT
  244. #endif
  245. #if defined(MY_RS485)
  246. #define __RS485CNT 1 //!< __RS485CNT
  247. #else
  248. #define __RS485CNT 0 //!< __RS485CNT
  249. #endif
  250. #if (__RF24CNT + __NRF5ESBCNT + __RFM69CNT + __RFM95CNT + __RS485CNT > 1)
  251. #error Only one forward link driver can be activated
  252. #endif
  253. #endif //DOXYGEN
  254. // SANITY CHECK
  255. #if defined(MY_REPEATER_FEATURE) || defined(MY_GATEWAY_FEATURE)
  256. #define MY_TRANSPORT_SANITY_CHECK //!< enable regular transport sanity checks
  257. #endif
  258. // TRANSPORT INCLUDES
  259. #if defined(MY_RADIO_RF24) || defined(MY_RADIO_NRF5_ESB) || defined(MY_RADIO_RFM69) || defined(MY_RADIO_RFM95) || defined(MY_RS485)
  260. #include "hal/transport/MyTransportHAL.h"
  261. #include "core/MyTransport.h"
  262. // PARENT CHECK
  263. #if defined(MY_PARENT_NODE_IS_STATIC) && (MY_PARENT_NODE_ID == AUTO)
  264. #error Parent is static but no parent ID defined, set MY_PARENT_NODE_ID.
  265. #endif
  266. #if defined(MY_TRANSPORT_DONT_CARE_MODE)
  267. #error MY_TRANSPORT_DONT_CARE_MODE is deprecated, set MY_TRANSPORT_WAIT_READY_MS instead!
  268. #endif
  269. // RAM ROUTING TABLE
  270. #if defined(MY_RAM_ROUTING_TABLE_FEATURE) && defined(MY_REPEATER_FEATURE)
  271. // activate feature based on architecture
  272. #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_NRF5) || defined(ARDUINO_ARCH_STM32F1) || defined(TEENSYDUINO) || defined(__linux__)
  273. #define MY_RAM_ROUTING_TABLE_ENABLED
  274. #elif defined(ARDUINO_ARCH_AVR)
  275. #if defined(__avr_atmega1280__) || defined(__avr_atmega1284__) || defined(__avr_atmega2560__)
  276. // >4kb, enable it
  277. #define MY_RAM_ROUTING_TABLE_ENABLED
  278. #else
  279. // memory limited, enable with care
  280. // #define MY_RAM_ROUTING_TABLE_ENABLED
  281. #endif // __avr_atmega1280__, __avr_atmega1284__, __avr_atmega2560__
  282. #endif // ARDUINO_ARCH_AVR
  283. #endif
  284. #ifdef DOXYGEN
  285. /**
  286. * @def MY_RAM_ROUTING_TABLE_ENABLED
  287. * @brief Automatically set if RAM routing table is enabled
  288. *
  289. * @see MY_RAM_ROUTING_TABLE_FEATURE
  290. */
  291. #define MY_RAM_ROUTING_TABLE_ENABLED
  292. #endif
  293. // SOFTSPI
  294. #ifdef MY_SOFTSPI
  295. #if defined(ARDUINO_ARCH_ESP8266)
  296. #error Soft SPI is not available on ESP8266
  297. #endif
  298. #include "hal/architecture/AVR/drivers/DigitalIO/DigitalIO.h"
  299. #endif
  300. // SOFTSERIAL
  301. #if defined(MY_GSM_TX) != defined(MY_GSM_RX)
  302. #error Both, MY_GSM_TX and MY_GSM_RX need to be defined when using SoftSerial
  303. #endif
  304. #if defined(MY_GATEWAY_TINYGSM) && !defined(SerialAT) && (!defined(MY_GSM_TX) || !defined(MY_GSM_RX))
  305. #error You need to define either SerialAT or MY_GSM_RX and MY_GSM_TX pins
  306. #endif
  307. // POWER PIN
  308. #ifndef DOXYGEN
  309. #if defined(MY_RF24_POWER_PIN) || defined(MY_RFM69_POWER_PIN) || defined(MY_RFM95_POWER_PIN) || defined(MY_RADIO_NRF5_ESB)
  310. #define RADIO_CAN_POWER_OFF (true)
  311. #else
  312. #define RADIO_CAN_POWER_OFF (false)
  313. #endif
  314. #endif
  315. // Transport drivers
  316. #if defined(MY_RADIO_RF24)
  317. #include "hal/transport/RF24/driver/RF24.cpp"
  318. #include "hal/transport/RF24/MyTransportRF24.cpp"
  319. #elif defined(MY_RADIO_NRF5_ESB)
  320. #if !defined(ARDUINO_ARCH_NRF5)
  321. #error No support for nRF5 radio on this platform
  322. #endif
  323. #include "hal/transport/NRF5_ESB/driver/Radio.cpp"
  324. #include "hal/transport/NRF5_ESB/driver/Radio_ESB.cpp"
  325. #include "hal/transport/NRF5_ESB/MyTransportNRF5_ESB.cpp"
  326. #elif defined(MY_RS485)
  327. #if !defined(MY_RS485_HWSERIAL)
  328. #if defined(__linux__)
  329. #error You must specify MY_RS485_HWSERIAL for RS485 transport
  330. #endif
  331. #include "drivers/AltSoftSerial/AltSoftSerial.cpp"
  332. #endif
  333. #include "hal/transport/RS485/MyTransportRS485.cpp"
  334. #elif defined(MY_RADIO_RFM69)
  335. #if defined(MY_RFM69_NEW_DRIVER)
  336. #include "hal/transport/RFM69/driver/new/RFM69_new.cpp"
  337. #else
  338. #include "hal/transport/RFM69/driver/old/RFM69_old.cpp"
  339. #endif
  340. #include "hal/transport/RFM69/MyTransportRFM69.cpp"
  341. #elif defined(MY_RADIO_RFM95)
  342. #include "hal/transport/RFM95/driver/RFM95.cpp"
  343. #include "hal/transport/RFM95/MyTransportRFM95.cpp"
  344. #endif
  345. // PASSIVE MODE
  346. #if defined(MY_PASSIVE_NODE) && !defined(DOXYGEN)
  347. #define MY_TRANSPORT_UPLINK_CHECK_DISABLED
  348. #define MY_PARENT_NODE_IS_STATIC
  349. #undef MY_REGISTRATION_FEATURE
  350. #undef MY_SIGNING_FEATURE
  351. #undef MY_OTA_FIRMWARE_FEATURE
  352. #if (defined(MY_GATEWAY_FEATURE) || defined(MY_REPEATER_FEATURE))
  353. #error This node is configured as GW/repeater, MY_PASSIVE_NODE cannot be set simultaneously
  354. #endif
  355. #if (MY_NODE_ID == AUTO)
  356. #error MY_PASSIVE_NODE configuration requires setting MY_NODE_ID
  357. #endif
  358. #endif
  359. #include "core/MyTransport.cpp"
  360. #endif
  361. // Make sure to disable child features when parent feature is disabled
  362. #if !defined(MY_SENSOR_NETWORK)
  363. #undef MY_OTA_FIRMWARE_FEATURE
  364. #undef MY_REPEATER_FEATURE
  365. #undef MY_SIGNING_NODE_WHITELISTING
  366. #undef MY_SIGNING_FEATURE
  367. #endif
  368. #if !defined(MY_GATEWAY_FEATURE)
  369. #undef MY_INCLUSION_MODE_FEATURE
  370. #undef MY_INCLUSION_BUTTON_FEATURE
  371. #endif
  372. #if !defined(MY_CORE_ONLY)
  373. #if !defined(MY_GATEWAY_FEATURE) && !defined(MY_SENSOR_NETWORK)
  374. #error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
  375. #endif
  376. #endif
  377. #include "core/MyCapabilities.h"
  378. #include "core/MyMessage.cpp"
  379. #include "core/MySplashScreen.cpp"
  380. #include "core/MySensorsCore.cpp"
  381. // HW mains
  382. #if defined(ARDUINO_ARCH_AVR)
  383. #include "hal/architecture/AVR/MyMainAVR.cpp"
  384. #elif defined(ARDUINO_ARCH_SAMD)
  385. #include "hal/architecture/SAMD/MyMainSAMD.cpp"
  386. #elif defined(ARDUINO_ARCH_ESP8266)
  387. #include "hal/architecture/ESP8266/MyMainESP8266.cpp"
  388. #elif defined(ARDUINO_ARCH_NRF5)
  389. #include "hal/architecture/NRF5/MyMainNRF5.cpp"
  390. #elif defined(ARDUINO_ARCH_ESP32)
  391. #include "hal/architecture/ESP32/MyMainESP32.cpp"
  392. #elif defined(__linux__)
  393. #include "hal/architecture/Linux/MyMainLinuxGeneric.cpp"
  394. #elif defined(ARDUINO_ARCH_STM32F1)
  395. #include "hal/architecture/STM32F1/MyMainSTM32F1.cpp"
  396. #elif defined(TEENSYDUINO)
  397. #include "hal/architecture/Teensy3/MyMainTeensy3.cpp"
  398. #endif
  399. #endif
  400. /** @}*/