@@ -12,6 +12,7 @@ const char* mqttServer = "192.168.1.100";
12
12
const int mqttPort = 1883 ;
13
13
const char * mqttUser = " admin" ;
14
14
const char * mqttPassword = " admin" ;
15
+ const char * mqttDeviceId = " RelayBoard-1" ;
15
16
16
17
// firmware
17
18
const char * hearthbeatTopic = " devices/arduino/relayboard-1/heartbeat" ;
@@ -83,103 +84,44 @@ PubSubClient mqttClient(ethClient);
83
84
AsyncDelay delay_ethCheckConnection;
84
85
AsyncDelay delay_hearthbeat;
85
86
86
- // main methods definitions
87
87
void connectEthernet ();
88
88
void connectMqtt ();
89
89
void restartAllConnections ();
90
+ void pushHearthbeat ();
91
+ void prepareOutputPins ();
92
+ void prepareInputPins ();
93
+ bool connectionIsOk ();
94
+ void prepareTimers ();
95
+ void checkEthernetAndReconnectIfConnectionLost ();
96
+ void checkMqttConnectionAndReconnectIfConnectionLost ();
97
+ void checkInputChangesAndPublishToMqtt ();
90
98
void callback (char * topic, byte* payload, unsigned int length);
91
99
void setPortViaMqttTopicStatus (int port, char *topic, byte *payload, unsigned int length, bool pingAndReturn, bool valueForPing);
92
100
void publishPortStatusToMqtt (char * topic, int port, bool publishTrueIfInputLow);
93
101
94
- // master setup method
95
102
void setup () {
96
103
Serial.begin (115200 );
97
104
98
- Serial.print (" Set timer for check ethernet connection to (miliseconds):" );
99
- Serial.println (ethCheckConnectionTimerMillis);
100
- delay_ethCheckConnection.start (ethCheckConnectionTimerMillis, AsyncDelay::MILLIS);
101
-
102
- Serial.print (" Set timer for sending heartbeat to (miliseconds):" );
103
- Serial.println (hearthbeatTimerMillis);
104
- delay_hearthbeat.start (hearthbeatTimerMillis, AsyncDelay::MILLIS);
105
-
106
- // prepare output pins (set PINs as OUTPUT and write default value from config)
107
- Serial.println (" Setting pin mode for OUTPUTS:" );
108
- for (int i =0 ; i < sizeof (settingsOutput) / sizeof (settingsOutput[0 ]); i++) {
109
- Serial.print (" - subscribe topic: " );
110
- Serial.println (settingsOutput[i].subscribedTopic );
111
- Serial.print (" - pin: " );
112
- Serial.println (settingsOutput[i].pin );
113
- Serial.print (" - logic: " );
114
- Serial.println (settingsOutput[i].defaultLogic );
115
-
116
- pinMode (settingsOutput[i].pin , OUTPUT);
117
- digitalWrite (settingsOutput[i].pin , settingsOutput[i].defaultLogic );
118
- }
105
+ prepareTimers ();
119
106
120
- // prepare input pins
121
- Serial.println (" Setting pin mode for INPUTS:" );
122
- for (int i =0 ; i < sizeof (settingsInput) / sizeof (settingsInput[0 ]); i++) {
123
- Serial.print (" - subscribe topic: " );
124
- Serial.println (settingsInput[i].publishToTopic );
125
- Serial.print (" - pin: " );
126
- Serial.println (settingsInput[i].pin );
127
-
128
- pinMode (settingsInput[i].pin , INPUT);
129
-
130
- if (settingsInput[i].publishTrueIfInputLow ) {
131
- Serial.print (" - set as HIGH for enable pull-up" );
132
-
133
- digitalWrite (settingsInput[i].pin , HIGH); // Enable pull-up rezistors
134
- }
135
- }
107
+ prepareOutputPins ();
108
+ prepareInputPins ();
136
109
137
110
connectEthernet ();
138
111
connectMqtt ();
139
112
}
140
113
141
114
void loop () {
142
- if (delay_ethCheckConnection.isExpired ()) {
143
- Serial.println (" Check ethernet connection." );
144
115
145
- if (!ethClient.connected ()) {
146
- Serial.println (" Connection lost... Reconnecting..." );
147
- connectEthernet ();
148
- connectMqtt ();
149
- }
116
+ checkEthernetAndReconnectIfConnectionLost ();
150
117
151
- delay_ethCheckConnection.repeat ();
152
- }
118
+ checkMqttConnectionAndReconnectIfConnectionLost ();
153
119
154
120
mqttClient.loop ();
155
121
156
- if (delay_hearthbeat.isExpired ()) {
157
- Serial.print (" Send hearthbeat to topic: " );
158
- Serial.println (hearthbeatTopic);
159
-
160
- mqttClient.publish (hearthbeatTopic, " ON" , true );
161
-
162
- delay_hearthbeat.repeat ();
163
- }
164
-
165
- for (int i =0 ; i < sizeof (settingsInput) / sizeof (settingsInput[0 ]); i++) {
166
- if (digitalRead (settingsInput[i].pin ) != settingsInputPrevious[i]) {
167
- Serial.println (" SettingsInput have changes, publish PIN status to MQTT (publishPortStatusToMqtt):" );
168
- Serial.print (" - topic: " );
169
- Serial.println (settingsInput[i].publishToTopic );
170
- Serial.print (" - pin: " );
171
- Serial.println (settingsInput[i].pin );
172
- Serial.print (" - publish true if input low: " );
173
- Serial.println (settingsInput[i].publishTrueIfInputLow );
174
-
175
- publishPortStatusToMqtt (settingsInput[i].publishToTopic , settingsInput[i].pin , settingsInput[i].publishTrueIfInputLow );
122
+ pushHearthbeat ();
176
123
177
- Serial.print (" - set settingsInputPrevious:" );
178
- Serial.println (settingsInput[i].pin );
179
-
180
- settingsInputPrevious[i] = digitalRead (settingsInput[i].pin );
181
- }
182
- }
124
+ checkInputChangesAndPublishToMqtt ();
183
125
}
184
126
185
127
// MQTT subscribe
@@ -244,6 +186,8 @@ void publishPortStatusToMqtt(char* topic, int pin, bool publishTrueIfInputLow) {
244
186
Serial.println (pin);
245
187
Serial.println (" ##############" );
246
188
} else {
189
+ Serial.print (" Publishing failed! Restart all connections!!!" );
190
+
247
191
restartAllConnections ();
248
192
}
249
193
}
@@ -286,7 +230,7 @@ void setPortViaMqttTopicStatus(int port, char *topic, byte *payload, unsigned in
286
230
}
287
231
288
232
void connectEthernet () {
289
- Serial.println ( " Connect to ethernet wire " );
233
+ Serial.print ( " Connecting to ethernet network. " );
290
234
291
235
Ethernet.begin (mac);
292
236
}
@@ -310,14 +254,19 @@ void connectMqtt() {
310
254
mqttClient.setCallback (callback);
311
255
312
256
while (!mqttClient.connected ()) {
313
- Serial.println (" Connecting to server..." );
314
- if (!mqttClient.connect (" deviceId" , mqttUser, mqttPassword )) {
257
+ Serial.print (" Connecting MQTT to server: " );
258
+
259
+ if (!mqttClient.connect (mqttDeviceId, mqttUser, mqttPassword )) {
260
+
261
+ Serial.print (" (disconnect all mqtt connections)" );
262
+ mqttClient.disconnect ();
263
+
315
264
Serial.print (" - failed with state " );
316
265
Serial.println (mqttClient.state ());
317
266
delay (5000 );
318
267
}
319
268
}
320
- Serial.println (" - connected" );
269
+ Serial.println (" - connected" );
321
270
322
271
Serial.println (" Set subscribe for all OUTPUT topics:" );
323
272
for (int i =0 ; i < sizeof (settingsOutput) / sizeof (settingsOutput[0 ]); i++) {
@@ -339,3 +288,110 @@ void restartAllConnections() {
339
288
340
289
connectMqtt ();
341
290
}
291
+
292
+ void pushHearthbeat () {
293
+ if (delay_hearthbeat.isExpired ()) {
294
+ Serial.print (" Send hearthbeat to topic: " );
295
+ Serial.println (hearthbeatTopic);
296
+
297
+ mqttClient.publish (hearthbeatTopic, " ON" , true );
298
+
299
+ delay_hearthbeat.repeat ();
300
+ }
301
+ }
302
+
303
+ bool connectionIsOk () {
304
+ return ethClient.connected ();
305
+ }
306
+
307
+ void checkEthernetAndReconnectIfConnectionLost () {
308
+ if (delay_ethCheckConnection.isExpired ()) {
309
+ Serial.print (" Check network connection: " );
310
+
311
+ if (!connectionIsOk ()) {
312
+ Serial.print (" lost" );
313
+
314
+ Serial.println (" Connection lost... Reconnecting..." );
315
+ restartAllConnections ();
316
+ }
317
+
318
+ Serial.print (" ok" );
319
+
320
+ delay_ethCheckConnection.repeat ();
321
+ }
322
+ }
323
+
324
+ void checkMqttConnectionAndReconnectIfConnectionLost () {
325
+ if (!mqttClient.connected ()) {
326
+ Serial.println (" Connection to MQTT server lost - reconnecting." );
327
+ connectMqtt ();
328
+ }
329
+ }
330
+
331
+ void prepareTimers () {
332
+ Serial.print (" Set timer for check ethernet connection to (miliseconds):" );
333
+ Serial.println (ethCheckConnectionTimerMillis);
334
+
335
+ delay_ethCheckConnection.start (ethCheckConnectionTimerMillis, AsyncDelay::MILLIS);
336
+
337
+ Serial.print (" Set timer for sending heartbeat to (miliseconds):" );
338
+ Serial.println (hearthbeatTimerMillis);
339
+
340
+ delay_hearthbeat.start (hearthbeatTimerMillis, AsyncDelay::MILLIS);
341
+ }
342
+
343
+ void prepareOutputPins () {
344
+ Serial.println (" Setting pin mode for OUTPUTS:" );
345
+
346
+ for (int i =0 ; i < sizeof (settingsOutput) / sizeof (settingsOutput[0 ]); i++) {
347
+ Serial.print (" - subscribe topic: " );
348
+ Serial.println (settingsOutput[i].subscribedTopic );
349
+ Serial.print (" - pin: " );
350
+ Serial.println (settingsOutput[i].pin );
351
+ Serial.print (" - logic: " );
352
+ Serial.println (settingsOutput[i].defaultLogic );
353
+
354
+ pinMode (settingsOutput[i].pin , OUTPUT);
355
+ digitalWrite (settingsOutput[i].pin , settingsOutput[i].defaultLogic );
356
+ }
357
+ }
358
+
359
+ void prepareInputPins () {
360
+ Serial.println (" Setting pin mode for INPUTS:" );
361
+
362
+ for (int i =0 ; i < sizeof (settingsInput) / sizeof (settingsInput[0 ]); i++) {
363
+ Serial.print (" - subscribe topic: " );
364
+ Serial.println (settingsInput[i].publishToTopic );
365
+ Serial.print (" - pin: " );
366
+ Serial.println (settingsInput[i].pin );
367
+
368
+ pinMode (settingsInput[i].pin , INPUT);
369
+
370
+ if (settingsInput[i].publishTrueIfInputLow ) {
371
+ Serial.print (" - set as HIGH for enable pull-up" );
372
+
373
+ digitalWrite (settingsInput[i].pin , HIGH); // Enable pull-up rezistors
374
+ }
375
+ }
376
+ }
377
+
378
+ void checkInputChangesAndPublishToMqtt () {
379
+ for (int i =0 ; i < sizeof (settingsInput) / sizeof (settingsInput[0 ]); i++) {
380
+ if (digitalRead (settingsInput[i].pin ) != settingsInputPrevious[i]) {
381
+ Serial.println (" SettingsInput have changes, publish PIN status to MQTT (publishPortStatusToMqtt):" );
382
+ Serial.print (" - topic: " );
383
+ Serial.println (settingsInput[i].publishToTopic );
384
+ Serial.print (" - pin: " );
385
+ Serial.println (settingsInput[i].pin );
386
+ Serial.print (" - publish true if input low: " );
387
+ Serial.println (settingsInput[i].publishTrueIfInputLow );
388
+
389
+ publishPortStatusToMqtt (settingsInput[i].publishToTopic , settingsInput[i].pin , settingsInput[i].publishTrueIfInputLow );
390
+
391
+ Serial.print (" - set settingsInputPrevious:" );
392
+ Serial.println (settingsInput[i].pin );
393
+
394
+ settingsInputPrevious[i] = digitalRead (settingsInput[i].pin );
395
+ }
396
+ }
397
+ }
0 commit comments