Browse Source

fix mqtt and telegram apis

Thomas Buck 1 year ago
parent
commit
fedf9a19a9
5 changed files with 174 additions and 86 deletions
  1. 1
    1
      include/Functionality.h
  2. 1
    1
      include/Statemachine.h
  3. 2
    2
      src/Functionality.cpp
  4. 14
    3
      src/Statemachine.cpp
  5. 156
    79
      src/WifiStuff.cpp

+ 1
- 1
include/Functionality.h View File

47
 
47
 
48
 #if defined(TELEGRAM_TOKEN) || defined(MQTT_HOST)
48
 #if defined(TELEGRAM_TOKEN) || defined(MQTT_HOST)
49
 void sm_bot_abort(void);
49
 void sm_bot_abort(void);
50
-void sm_bot_start_auto(BoolField ferts, BoolField plants);
50
+void sm_bot_start_auto(BoolField &ferts, BoolField &plants);
51
 #endif // TELEGRAM_TOKEN || MQTT_HOST
51
 #endif // TELEGRAM_TOKEN || MQTT_HOST
52
 
52
 
53
 #endif // FUNCTION_CONTROL
53
 #endif // FUNCTION_CONTROL

+ 1
- 1
include/Statemachine.h View File

126
 
126
 
127
 #if defined(TELEGRAM_TOKEN) || defined(MQTT_HOST)
127
 #if defined(TELEGRAM_TOKEN) || defined(MQTT_HOST)
128
     void bot_abort(void);
128
     void bot_abort(void);
129
-    void bot_start_auto(BoolField ferts, BoolField plants);
129
+    void bot_start_auto(BoolField &ferts, BoolField &plants);
130
 #endif // TELEGRAM_TOKEN || MQTT_HOST
130
 #endif // TELEGRAM_TOKEN || MQTT_HOST
131
     
131
     
132
 private:
132
 private:

+ 2
- 2
src/Functionality.cpp View File

82
     sm.bot_abort();
82
     sm.bot_abort();
83
 }
83
 }
84
 
84
 
85
-void sm_bot_start_auto(BoolField ferts, BoolField plants) {
85
+void sm_bot_start_auto(BoolField &ferts, BoolField &plants) {
86
     sm.bot_start_auto(ferts, plants);
86
     sm.bot_start_auto(ferts, plants);
87
 }
87
 }
88
 
88
 
570
 
570
 
571
         Wire.endTransmission();
571
         Wire.endTransmission();
572
     }
572
     }
573
-    
573
+
574
     Wire.beginTransmission(OWN_I2C_ADDRESS);
574
     Wire.beginTransmission(OWN_I2C_ADDRESS);
575
     Wire.write(0x04); // button command
575
     Wire.write(0x04); // button command
576
     Wire.write((int8_t)num_input);
576
     Wire.write((int8_t)num_input);

+ 14
- 3
src/Statemachine.cpp View File

181
     switch_to(auto_done);
181
     switch_to(auto_done);
182
 }
182
 }
183
 
183
 
184
-void Statemachine::bot_start_auto(BoolField _ferts, BoolField _plants) {
185
-    selected_ferts = _ferts;
186
-    selected_plants = _plants;
184
+void Statemachine::bot_start_auto(BoolField &_ferts, BoolField &_plants) {
185
+    selected_ferts.clear();
186
+    for (int i = 0; i < plants.countFertilizers(); i++) {
187
+        if (_ferts.isSet(i)) {
188
+            selected_ferts.set(i);
189
+        }
190
+    }
191
+
192
+    selected_plants.clear();
193
+    for (int i = 0; i < plants.countPlants(); i++) {
194
+        if (_plants.isSet(i)) {
195
+            selected_plants.set(i);
196
+        }
197
+    }
187
 
198
 
188
     // check if we need to run fertilizers
199
     // check if we need to run fertilizers
189
     if (selected_ferts.countSet() > 0) {
200
     if (selected_ferts.countSet() > 0) {

+ 156
- 79
src/WifiStuff.cpp View File

71
 
71
 
72
 enum telegram_state bot_state = BOT_IDLE;
72
 enum telegram_state bot_state = BOT_IDLE;
73
 String bot_lock = "";
73
 String bot_lock = "";
74
-BoolField bot_plants(VALVE_COUNT - 1);
75
-BoolField bot_ferts(PUMP_COUNT);
76
 
74
 
77
 #endif // TELEGRAM_TOKEN
75
 #endif // TELEGRAM_TOKEN
78
 
76
 
79
 #ifdef MQTT_HOST
77
 #ifdef MQTT_HOST
78
+
80
 #include <PubSubClient.h>
79
 #include <PubSubClient.h>
81
 WiFiClient mqttClient;
80
 WiFiClient mqttClient;
82
 PubSubClient mqtt(mqttClient);
81
 PubSubClient mqtt(mqttClient);
83
 unsigned long last_mqtt_reconnect_time = 0;
82
 unsigned long last_mqtt_reconnect_time = 0;
84
-BoolField mqtt_plants(VALVE_COUNT - 1);
85
-BoolField mqtt_ferts(PUMP_COUNT);
83
+
86
 #endif // MQTT_HOST
84
 #endif // MQTT_HOST
87
 
85
 
86
+#if defined(TELEGRAM_TOKEN) || defined(MQTT_HOST)
87
+static BoolField bot_plants(VALVE_COUNT - 1);
88
+static BoolField bot_ferts(PUMP_COUNT);
89
+#endif // TELEGRAM_TOKEN || MQTT_HOST
90
+
88
 UPDATE_WEB_SERVER server(80);
91
 UPDATE_WEB_SERVER server(80);
89
 WebSocketsServer socket = WebSocketsServer(81);
92
 WebSocketsServer socket = WebSocketsServer(81);
90
 SimpleUpdater updater;
93
 SimpleUpdater updater;
112
 
115
 
113
 void runGpioTest(bool state) {
116
 void runGpioTest(bool state) {
114
     lastGpioTime = millis();
117
     lastGpioTime = millis();
115
-    
118
+
116
     for (int i = 0; i < VALVE_COUNT; i++) {
119
     for (int i = 0; i < VALVE_COUNT; i++) {
117
         get_plants()->getValves()->setPin(i, state);
120
         get_plants()->getValves()->setPin(i, state);
118
         delay(GPIO_TEST_DELAY);
121
         delay(GPIO_TEST_DELAY);
119
     }
122
     }
120
-    
123
+
121
     for (int i = 0; i < PUMP_COUNT; i++) {
124
     for (int i = 0; i < PUMP_COUNT; i++) {
122
         get_plants()->getPumps()->setPin(i, state);
125
         get_plants()->getPumps()->setPin(i, state);
123
         if (i < (PUMP_COUNT - 1)) {
126
         if (i < (PUMP_COUNT - 1)) {
129
 void handleGpioTest() {
132
 void handleGpioTest() {
130
     runningGpioTest = !runningGpioTest;
133
     runningGpioTest = !runningGpioTest;
131
     gpioTestState = runningGpioTest;
134
     gpioTestState = runningGpioTest;
132
-    
135
+
133
     String message = F("GPIOs turned ");
136
     String message = F("GPIOs turned ");
134
     message += runningGpioTest ? "on" : "off";
137
     message += runningGpioTest ? "on" : "off";
135
 
138
 
136
     server.send(200, "text/html", message);
139
     server.send(200, "text/html", message);
137
-    
140
+
138
     runGpioTest(gpioTestState);
141
     runGpioTest(gpioTestState);
139
 }
142
 }
140
 
143
 
148
 #endif // TELEGRAM_TOKEN
151
 #endif // TELEGRAM_TOKEN
149
 
152
 
150
 #ifdef MQTT_HOST
153
 #ifdef MQTT_HOST
151
-    mqtt.publish("giessomat", s);
154
+    String payload = String("state: ") + s;
155
+    mqtt.publish("giessomat", payload.c_str());
152
 #endif // MQTT_HOST
156
 #endif // MQTT_HOST
153
 }
157
 }
154
 
158
 
390
             debug.println("MQTT: user abort");
394
             debug.println("MQTT: user abort");
391
         }
395
         }
392
     } else {
396
     } else {
397
+        if (ps.substring(0, 6) == "state:") {
398
+            return;
399
+        }
400
+
393
         if (ps.substring(0, 4) != "auto") {
401
         if (ps.substring(0, 4) != "auto") {
394
             debug.println("MQTT: invalid payload");
402
             debug.println("MQTT: invalid payload");
395
             return;
403
             return;
396
         }
404
         }
397
 
405
 
398
-        mqtt_ferts.clear();
399
-        mqtt_plants.clear();
406
+        if (!sm_is_idle()) {
407
+            debug.println("MQTT: machine is in use");
408
+            return;
409
+        }
410
+
411
+        bot_ferts.clear();
412
+        bot_plants.clear();
400
 
413
 
401
         String buff;
414
         String buff;
402
         bool at_plants = false;
415
         bool at_plants = false;
405
                 if (buff != "none") {
418
                 if (buff != "none") {
406
                     int n = buff.toInt() - 1;
419
                     int n = buff.toInt() - 1;
407
                     if (!at_plants) {
420
                     if (!at_plants) {
408
-                        mqtt_ferts.set(n);
421
+                        bot_ferts.set(n);
409
                     } else {
422
                     } else {
410
-                        mqtt_plants.set(n);
423
+                        bot_plants.set(n);
411
                     }
424
                     }
412
                 }
425
                 }
413
                 buff = "";
426
                 buff = "";
422
 
435
 
423
         String s = "MQTT: fertilizers:";
436
         String s = "MQTT: fertilizers:";
424
         for (int i = 0; i < PUMP_COUNT; i++) {
437
         for (int i = 0; i < PUMP_COUNT; i++) {
425
-            if (mqtt_ferts.isSet(i)) {
438
+            if (bot_ferts.isSet(i)) {
426
                 s += " " + String(i + 1);
439
                 s += " " + String(i + 1);
427
             }
440
             }
428
         }
441
         }
430
 
443
 
431
         s = "MQTT: plants:";
444
         s = "MQTT: plants:";
432
         for (int i = 0; i < (VALVE_COUNT - 1); i++) {
445
         for (int i = 0; i < (VALVE_COUNT - 1); i++) {
433
-            if (mqtt_plants.isSet(i)) {
446
+            if (bot_plants.isSet(i)) {
434
                 s += " " + String(i + 1);
447
                 s += " " + String(i + 1);
435
             }
448
             }
436
         }
449
         }
437
         debug.println(s);
450
         debug.println(s);
438
 
451
 
439
-        if (mqtt_plants.countSet() <= 0) {
452
+        if (bot_plants.countSet() <= 0) {
440
             debug.println("MQTT: no plants selected");
453
             debug.println("MQTT: no plants selected");
441
             return;
454
             return;
442
         }
455
         }
443
 
456
 
444
 #ifdef FULLAUTO_MIN_PLANT_COUNT
457
 #ifdef FULLAUTO_MIN_PLANT_COUNT
445
-        if (mqtt_plants.countSet() < FULLAUTO_MIN_PLANT_COUNT) {
458
+        if (bot_plants.countSet() < FULLAUTO_MIN_PLANT_COUNT) {
446
             debug.println("MQTT: not enough plants selected");
459
             debug.println("MQTT: not enough plants selected");
447
             return;
460
             return;
448
         }
461
         }
449
 #endif
462
 #endif
450
 
463
 
451
-        sm_bot_start_auto(mqtt_ferts, mqtt_plants);
464
+        sm_bot_start_auto(bot_ferts, bot_plants);
452
     }
465
     }
453
 }
466
 }
454
 
467
 
521
     if (socket.connectedClients() <= 0) {
534
     if (socket.connectedClients() <= 0) {
522
         return;
535
         return;
523
     }
536
     }
524
-    
537
+
525
     String a = message_buffer_a ;
538
     String a = message_buffer_a ;
526
     String b = message_buffer_b;
539
     String b = message_buffer_b;
527
     String c = message_buffer_c;
540
     String c = message_buffer_c;
528
     String d = message_buffer_d;
541
     String d = message_buffer_d;
529
-    
542
+
530
     a.replace("\"", "'");
543
     a.replace("\"", "'");
531
     b.replace("\"", "'");
544
     b.replace("\"", "'");
532
     c.replace("\"", "'");
545
     c.replace("\"", "'");
533
     d.replace("\"", "'");
546
     d.replace("\"", "'");
534
-    
547
+
535
     String ws = "{\n";
548
     String ws = "{\n";
536
-    
549
+
537
     ws += "\"a\": \"" + a + "\",\n";
550
     ws += "\"a\": \"" + a + "\",\n";
538
     ws += "\"b\": \"" + b + "\",\n";
551
     ws += "\"b\": \"" + b + "\",\n";
539
     ws += "\"c\": \"" + c + "\",\n";
552
     ws += "\"c\": \"" + c + "\",\n";
540
     ws += "\"d\": \"" + d + "\",\n";
553
     ws += "\"d\": \"" + d + "\",\n";
541
-    
554
+
542
     ws += "\"state\": \"" + String(control_state_name()) + "\",\n";
555
     ws += "\"state\": \"" + String(control_state_name()) + "\",\n";
543
-    
556
+
544
     ws += F("\"valves\": [ ");
557
     ws += F("\"valves\": [ ");
545
     for (int i = 0; i < VALVE_COUNT; i++) {
558
     for (int i = 0; i < VALVE_COUNT; i++) {
546
         ws += "\"";
559
         ws += "\"";
547
         ws += get_plants()->getValves()->getPin(i) ? "1" : "0";
560
         ws += get_plants()->getValves()->getPin(i) ? "1" : "0";
548
         ws += "\"";
561
         ws += "\"";
549
-        
562
+
550
         if (i < (VALVE_COUNT - 1)) {
563
         if (i < (VALVE_COUNT - 1)) {
551
             ws += ", ";
564
             ws += ", ";
552
         }
565
         }
553
     }
566
     }
554
     ws += " ],\n";
567
     ws += " ],\n";
555
-    
568
+
556
     ws += F("\"pumps\": [ ");
569
     ws += F("\"pumps\": [ ");
557
     for (int i = 0; i < PUMP_COUNT; i++) {
570
     for (int i = 0; i < PUMP_COUNT; i++) {
558
         ws += "\"";
571
         ws += "\"";
559
         ws += get_plants()->getPumps()->getPin(i) ? "1" : "0";
572
         ws += get_plants()->getPumps()->getPin(i) ? "1" : "0";
560
         ws += "\"";
573
         ws += "\"";
561
-        
574
+
562
         if (i < (PUMP_COUNT - 1)) {
575
         if (i < (PUMP_COUNT - 1)) {
563
             ws += ", ";
576
             ws += ", ";
564
         }
577
         }
565
     }
578
     }
566
     ws += " ],\n";
579
     ws += " ],\n";
567
-    
580
+
568
     ws += F("\"switches\": [ ");
581
     ws += F("\"switches\": [ ");
569
     for (int i = 0; i < SWITCH_COUNT; i++) {
582
     for (int i = 0; i < SWITCH_COUNT; i++) {
570
         bool v = get_plants()->getSwitches()->getPin(i);
583
         bool v = get_plants()->getSwitches()->getPin(i);
571
-        
584
+
572
 #ifdef INVERT_SENSOR_BOTTOM
585
 #ifdef INVERT_SENSOR_BOTTOM
573
         if (i == 0) {
586
         if (i == 0) {
574
             v = !v;
587
             v = !v;
575
         }
588
         }
576
 #endif // INVERT_SENSOR_BOTTOM
589
 #endif // INVERT_SENSOR_BOTTOM
577
-        
590
+
578
 #ifdef INVERT_SENSOR_TOP
591
 #ifdef INVERT_SENSOR_TOP
579
         if (i == 1) {
592
         if (i == 1) {
580
             v = !v;
593
             v = !v;
584
         ws += "\"";
597
         ws += "\"";
585
         ws += v ? "1" : "0";
598
         ws += v ? "1" : "0";
586
         ws += "\"";
599
         ws += "\"";
587
-        
600
+
588
         if (i < (SWITCH_COUNT - 1)) {
601
         if (i < (SWITCH_COUNT - 1)) {
589
             ws += ", ";
602
             ws += ", ";
590
         }
603
         }
614
         }
627
         }
615
     }
628
     }
616
     ws += " ],\n";
629
     ws += " ],\n";
617
-    
630
+
618
     ws += "\"switchstate\": \"";
631
     ws += "\"switchstate\": \"";
619
     Plants::Waterlevel wl = get_plants()->getWaterlevel();
632
     Plants::Waterlevel wl = get_plants()->getWaterlevel();
620
     if (wl == Plants::empty) {
633
     if (wl == Plants::empty) {
628
     }
641
     }
629
     ws += "\"\n";
642
     ws += "\"\n";
630
     ws += "}";
643
     ws += "}";
631
-    
644
+
632
     wifi_send_websocket(ws);
645
     wifi_send_websocket(ws);
633
 }
646
 }
634
 
647
 
636
     socket.broadcastTXT(s);
649
     socket.broadcastTXT(s);
637
 }
650
 }
638
 
651
 
652
+#ifdef ARDUINO_ARCH_ESP32
653
+
654
+#include <rom/rtc.h>
655
+
656
+// https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/ResetReason/ResetReason.ino
657
+static const char *str_reset_reason(int reason) {
658
+    switch (reason) {
659
+    case 1:
660
+        return "POWERON_RESET";
661
+
662
+    case 3:
663
+        return "SW_RESET";
664
+
665
+    case 4:
666
+        return "OWDT_RESET";
667
+
668
+    case 5:
669
+        return "DEEPSLEEP_RESET";
670
+
671
+    case 6:
672
+        return "SDIO_RESET";
673
+
674
+    case 7:
675
+        return "TG0WDT_SYS_RESET";
676
+
677
+    case 8:
678
+        return "TG1WDT_SYS_RESET";
679
+
680
+    case 9:
681
+        return "RTCWDT_SYS_RESET";
682
+
683
+    case 10:
684
+        return "INTRUSION_RESET";
685
+
686
+    case 11:
687
+        return "TGWDT_CPU_RESET";
688
+
689
+    case 12:
690
+        return "SW_CPU_RESET";
691
+
692
+    case 13:
693
+        return "RTCWDT_CPU_RESET";
694
+
695
+    case 14:
696
+        return "EXT_CPU_RESET";
697
+
698
+    case 15:
699
+        return "RTCWDT_BROWN_OUT_RESET";
700
+
701
+    case 16:
702
+        return "RTCWDT_RTC_RESET";
703
+
704
+    default:
705
+        return "NO_MEAN";
706
+    }
707
+}
708
+
709
+#endif // ARDUINO_ARCH_ESP32
710
+
639
 void handleRoot() {
711
 void handleRoot() {
640
     String message = F("<!DOCTYPE html>\n");
712
     String message = F("<!DOCTYPE html>\n");
641
     message += F("<html><head>\n");
713
     message += F("<html><head>\n");
642
     message += F("<meta charset='utf-8'/>\n");
714
     message += F("<meta charset='utf-8'/>\n");
643
     message += F("<meta name='viewport' content='width=device-width, initial-scale=1'/>\n");
715
     message += F("<meta name='viewport' content='width=device-width, initial-scale=1'/>\n");
644
     message += F("<title>Gieß-o-mat</title>\n");
716
     message += F("<title>Gieß-o-mat</title>\n");
645
-    
717
+
646
     message += F("<style type='text/css'>\n");
718
     message += F("<style type='text/css'>\n");
647
     message += F(".head {\n");
719
     message += F(".head {\n");
648
     message += F("text-align: center;\n");
720
     message += F("text-align: center;\n");
653
     message += F("max-width: 1200px;\n");
725
     message += F("max-width: 1200px;\n");
654
     message += F("margin: auto;\n");
726
     message += F("margin: auto;\n");
655
     message += F("}\n");
727
     message += F("}\n");
656
-    
728
+
657
     message += F(".ui {\n");
729
     message += F(".ui {\n");
658
     message += F("width: max-content;\n");
730
     message += F("width: max-content;\n");
659
     message += F("height: max-content;\n");
731
     message += F("height: max-content;\n");
661
     message += F("padding: 0 1.0em;\n");
733
     message += F("padding: 0 1.0em;\n");
662
     message += F("border: 1px dashed black;\n");
734
     message += F("border: 1px dashed black;\n");
663
     message += F("}\n");
735
     message += F("}\n");
664
-    
736
+
665
     message += F(".io {\n");
737
     message += F(".io {\n");
666
     message += F("width: max-content;\n");
738
     message += F("width: max-content;\n");
667
     message += F("height: max-content;\n");
739
     message += F("height: max-content;\n");
670
     message += F("border: 1px dashed black;\n");
742
     message += F("border: 1px dashed black;\n");
671
     message += F("font-family: monospace;\n");
743
     message += F("font-family: monospace;\n");
672
     message += F("}\n");
744
     message += F("}\n");
673
-    
745
+
674
     message += F(".ioelem {\n");
746
     message += F(".ioelem {\n");
675
     message += F("width: max-content;\n");
747
     message += F("width: max-content;\n");
676
     message += F("border: 1px solid black;\n");
748
     message += F("border: 1px solid black;\n");
678
     message += F("padding: 1em;\n");
750
     message += F("padding: 1em;\n");
679
     message += F("margin: 0.5em;\n");
751
     message += F("margin: 0.5em;\n");
680
     message += F("}\n");
752
     message += F("}\n");
681
-    
753
+
682
     message += F(".info {\n");
754
     message += F(".info {\n");
683
     message += F("width: max-content;\n");
755
     message += F("width: max-content;\n");
684
     message += F("height: max-content;\n");
756
     message += F("height: max-content;\n");
686
     message += F("border: 1px dashed black;\n");
758
     message += F("border: 1px dashed black;\n");
687
     message += F("font-family: monospace;\n");
759
     message += F("font-family: monospace;\n");
688
     message += F("}\n");
760
     message += F("}\n");
689
-    
761
+
690
     message += F(".log {\n");
762
     message += F(".log {\n");
691
     message += F("max-height: 300px;\n");
763
     message += F("max-height: 300px;\n");
692
     message += F("padding: 0 1.0em;\n");
764
     message += F("padding: 0 1.0em;\n");
698
     message += F("overflow-y: scroll;\n");
770
     message += F("overflow-y: scroll;\n");
699
     message += F("word-break: break-all;\n");
771
     message += F("word-break: break-all;\n");
700
     message += F("}\n");
772
     message += F("}\n");
701
-    
773
+
702
     message += F("#logbuf {\n");
774
     message += F("#logbuf {\n");
703
     message += F("white-space: break-spaces;\n");
775
     message += F("white-space: break-spaces;\n");
704
     message += F("}\n");
776
     message += F("}\n");
705
-    
777
+
706
     message += F(".pad {\n");
778
     message += F(".pad {\n");
707
     message += F("background: black;\n");
779
     message += F("background: black;\n");
708
     message += F("border: 3px solid black;\n");
780
     message += F("border: 3px solid black;\n");
712
     message += F("margin-left: auto;\n");
784
     message += F("margin-left: auto;\n");
713
     message += F("margin-right: auto;\n");
785
     message += F("margin-right: auto;\n");
714
     message += F("}\n");
786
     message += F("}\n");
715
-    
787
+
716
     message += F(".pad input {\n");
788
     message += F(".pad input {\n");
717
     message += F("background: #fff0cf;\n");
789
     message += F("background: #fff0cf;\n");
718
     message += F("border-radius: 6px;\n");
790
     message += F("border-radius: 6px;\n");
722
     message += F("padding: 0.5em 1em;\n");
794
     message += F("padding: 0.5em 1em;\n");
723
     message += F("margin: 0.5em;\n");
795
     message += F("margin: 0.5em;\n");
724
     message += F("}\n");
796
     message += F("}\n");
725
-    
797
+
726
     // https://codepen.io/hawkz/pres/RpPaGK
798
     // https://codepen.io/hawkz/pres/RpPaGK
727
     message += F(".lcd {\n");
799
     message += F(".lcd {\n");
728
     //message += F("background: #9ea18c;\n");
800
     //message += F("background: #9ea18c;\n");
742
     message += F("margin-left: auto;\n");
814
     message += F("margin-left: auto;\n");
743
     message += F("margin-right: auto;\n");
815
     message += F("margin-right: auto;\n");
744
     message += F("}\n");
816
     message += F("}\n");
745
-    
817
+
746
     message += F("#state {\n");
818
     message += F("#state {\n");
747
     message += F("text-align: center;\n");
819
     message += F("text-align: center;\n");
748
     message += F("}\n");
820
     message += F("}\n");
788
     message += message_buffer_c + '\n';
860
     message += message_buffer_c + '\n';
789
     message += message_buffer_d + '\n';
861
     message += message_buffer_d + '\n';
790
     message += F("</pre>\n");
862
     message += F("</pre>\n");
791
-    
863
+
792
     message += F("<form class='pad'>\n");
864
     message += F("<form class='pad'>\n");
793
     message += F("<input type='button' value='1'>");
865
     message += F("<input type='button' value='1'>");
794
     message += F("<input type='button' value='2'>");
866
     message += F("<input type='button' value='2'>");
806
     message += F("<input type='button' value='0'>");
878
     message += F("<input type='button' value='0'>");
807
     message += F("<input type='button' value='#'>");
879
     message += F("<input type='button' value='#'>");
808
     message += F("</form>\n");
880
     message += F("</form>\n");
809
-    
881
+
810
     message += F("<p id='state'>\n");
882
     message += F("<p id='state'>\n");
811
     message += F("State: ");
883
     message += F("State: ");
812
     message += control_state_name();
884
     message += control_state_name();
813
     message += F("</p></div>\n");
885
     message += F("</p></div>\n");
814
-    
886
+
815
     message += F("<div class='io'>\n");
887
     message += F("<div class='io'>\n");
816
     message += F("Switches: <span id='switchstate'>");
888
     message += F("Switches: <span id='switchstate'>");
817
-    
889
+
818
     Plants::Waterlevel wl = get_plants()->getWaterlevel();
890
     Plants::Waterlevel wl = get_plants()->getWaterlevel();
819
     if (wl == Plants::empty) {
891
     if (wl == Plants::empty) {
820
         message += F("tank empty");
892
         message += F("tank empty");
826
         message += F("invalid sensor state");
898
         message += F("invalid sensor state");
827
     }
899
     }
828
     message += F("</span>");
900
     message += F("</span>");
829
-    
901
+
830
     message += F("<div class='container'>\n");
902
     message += F("<div class='container'>\n");
831
     for (int i = 0; i < SWITCH_COUNT; i++) {
903
     for (int i = 0; i < SWITCH_COUNT; i++) {
832
         message += F("<div class='ioelem switch' style='background-color: ");
904
         message += F("<div class='ioelem switch' style='background-color: ");
833
         bool v = get_plants()->getSwitches()->getPin(i);
905
         bool v = get_plants()->getSwitches()->getPin(i);
834
-        
906
+
835
 #ifdef INVERT_SENSOR_BOTTOM
907
 #ifdef INVERT_SENSOR_BOTTOM
836
         if (i == 0) {
908
         if (i == 0) {
837
             v = !v;
909
             v = !v;
838
         }
910
         }
839
 #endif // INVERT_SENSOR_BOTTOM
911
 #endif // INVERT_SENSOR_BOTTOM
840
-        
912
+
841
 #ifdef INVERT_SENSOR_TOP
913
 #ifdef INVERT_SENSOR_TOP
842
         if (i == 1) {
914
         if (i == 1) {
843
             v = !v;
915
             v = !v;
844
         }
916
         }
845
 #endif // INVERT_SENSOR_TOP
917
 #endif // INVERT_SENSOR_TOP
846
-        
918
+
847
         if (v) {
919
         if (v) {
848
             message += F("red");
920
             message += F("red");
849
         } else {
921
         } else {
869
         message += F("</div>");
941
         message += F("</div>");
870
     }
942
     }
871
     message += F("</div><hr>\n");
943
     message += F("</div><hr>\n");
872
-    
944
+
873
     message += F("Valves:\n");
945
     message += F("Valves:\n");
874
     message += F("<div class='container'>\n");
946
     message += F("<div class='container'>\n");
875
     for (int i = 0; i < VALVE_COUNT; i++) {
947
     for (int i = 0; i < VALVE_COUNT; i++) {
884
         message += F("</div>");
956
         message += F("</div>");
885
     }
957
     }
886
     message += F("</div><hr>\n");
958
     message += F("</div><hr>\n");
887
-    
959
+
888
     message += F("Pumps:\n");
960
     message += F("Pumps:\n");
889
     message += F("<div class='container'>\n");
961
     message += F("<div class='container'>\n");
890
     for (int i = 0; i < PUMP_COUNT; i++) {
962
     for (int i = 0; i < PUMP_COUNT; i++) {
918
     message += F("Green means valve is closed / pump is off / switch is not submersed.\n");
990
     message += F("Green means valve is closed / pump is off / switch is not submersed.\n");
919
     message += F("<br>\n");
991
     message += F("<br>\n");
920
     message += F("Red means valve is open / pump is running / switch is submersed.</div>\n");
992
     message += F("Red means valve is open / pump is running / switch is submersed.</div>\n");
921
-    
993
+
922
     message += F("<div class='info'><p>\n");
994
     message += F("<div class='info'><p>\n");
923
     message += F("Version: ");
995
     message += F("Version: ");
924
     message += FIRMWARE_VERSION;
996
     message += FIRMWARE_VERSION;
937
     message += F("\n</p>\n");
1009
     message += F("\n</p>\n");
938
 
1010
 
939
 #if defined(ARDUINO_ARCH_ESP8266)
1011
 #if defined(ARDUINO_ARCH_ESP8266)
940
-    
1012
+
941
     message += F("\n<p>\n");
1013
     message += F("\n<p>\n");
942
     message += F("Reset reason: ");
1014
     message += F("Reset reason: ");
943
     message += ESP.getResetReason();
1015
     message += ESP.getResetReason();
960
         message += (ESP.getFlashChipSize());
1032
         message += (ESP.getFlashChipSize());
961
         message += F(") does not match!");
1033
         message += F(") does not match!");
962
     }
1034
     }
963
-    
1035
+
964
     message += F("\n</p>\n");
1036
     message += F("\n</p>\n");
965
-    
1037
+
966
 #elif defined(ARDUINO_ARCH_ESP32)
1038
 #elif defined(ARDUINO_ARCH_ESP32)
967
 
1039
 
968
     message += F("\n<p>\n");
1040
     message += F("\n<p>\n");
1041
+    message += F("Reset reason: ");
1042
+    message += str_reset_reason(rtc_get_reset_reason(0));
1043
+    message += F(" ");
1044
+    message += str_reset_reason(rtc_get_reset_reason(1));
1045
+    message += F("\n<br>\n");
969
     message += F("Free heap: ");
1046
     message += F("Free heap: ");
970
     message += String(ESP.getFreeHeap() / 1024.0);
1047
     message += String(ESP.getFreeHeap() / 1024.0);
971
     message += F("k\n<br>\n");
1048
     message += F("k\n<br>\n");
975
     message += F("Flash chip size: ");
1052
     message += F("Flash chip size: ");
976
     message += String(ESP.getFlashChipSize() / 1024.0);
1053
     message += String(ESP.getFlashChipSize() / 1024.0);
977
     message += F("k\n</p>\n");
1054
     message += F("k\n</p>\n");
978
-    
1055
+
979
 #endif
1056
 #endif
980
 
1057
 
981
     message += F("<p>\n");
1058
     message += F("<p>\n");
1019
     message += F("<p>Try <a href='/update'>/update</a> for OTA firmware updates!</p>\n");
1096
     message += F("<p>Try <a href='/update'>/update</a> for OTA firmware updates!</p>\n");
1020
     message += F("<p>Made by <a href='https://xythobuz.de'>xythobuz</a></p>\n");
1097
     message += F("<p>Made by <a href='https://xythobuz.de'>xythobuz</a></p>\n");
1021
     message += F("<p><a href='https://git.xythobuz.de/thomas/giess-o-mat'>Project Repository</a></p>\n");
1098
     message += F("<p><a href='https://git.xythobuz.de/thomas/giess-o-mat'>Project Repository</a></p>\n");
1022
-    
1099
+
1023
 #ifdef ENABLE_GPIO_TEST
1100
 #ifdef ENABLE_GPIO_TEST
1024
     message += F("<p><a href='/gpiotest'>GPIO Test</a></p>\n");
1101
     message += F("<p><a href='/gpiotest'>GPIO Test</a></p>\n");
1025
 #endif // ENABLE_GPIO_TEST
1102
 #endif // ENABLE_GPIO_TEST
1026
-    
1103
+
1027
     message += F("</div></div>\n");
1104
     message += F("</div></div>\n");
1028
-    
1105
+
1029
     message += F("<div class='log'><pre id='logbuf'>\n");
1106
     message += F("<div class='log'><pre id='logbuf'>\n");
1030
     message += debug.getBuffer();
1107
     message += debug.getBuffer();
1031
     message += F("</pre></div>\n");
1108
     message += F("</pre></div>\n");
1032
     message += F("</body>\n");
1109
     message += F("</body>\n");
1033
-    
1110
+
1034
     message += F("<script type='text/javascript'>\n");
1111
     message += F("<script type='text/javascript'>\n");
1035
     message += F("var socket = new WebSocket('ws://' + window.location.hostname + ':81');\n");
1112
     message += F("var socket = new WebSocket('ws://' + window.location.hostname + ':81');\n");
1036
     message += F("socket.onmessage = function(e) {\n");
1113
     message += F("socket.onmessage = function(e) {\n");
1051
     message += F(    "lcd[0].innerHTML = str;\n");
1128
     message += F(    "lcd[0].innerHTML = str;\n");
1052
     message += F(    "var state = document.getElementById('state');\n");
1129
     message += F(    "var state = document.getElementById('state');\n");
1053
     message += F(    "state.innerHTML = \"State: \" + msg.state;\n");
1130
     message += F(    "state.innerHTML = \"State: \" + msg.state;\n");
1054
-    
1131
+
1055
     message += F(    "for (let i = 0; i < ");
1132
     message += F(    "for (let i = 0; i < ");
1056
     message += String(VALVE_COUNT);
1133
     message += String(VALVE_COUNT);
1057
     message += F("; i++) {\n");
1134
     message += F("; i++) {\n");
1062
     message += F(           "valves[i].style = 'background-color: red;';\n");
1139
     message += F(           "valves[i].style = 'background-color: red;';\n");
1063
     message += F(       "}\n");
1140
     message += F(       "}\n");
1064
     message += F(    "}\n");
1141
     message += F(    "}\n");
1065
-    
1142
+
1066
     message += F(    "for (let i = 0; i < ");
1143
     message += F(    "for (let i = 0; i < ");
1067
     message += String(PUMP_COUNT);
1144
     message += String(PUMP_COUNT);
1068
     message += F("; i++) {\n");
1145
     message += F("; i++) {\n");
1073
     message += F(           "pumps[i].style = 'background-color: red;';\n");
1150
     message += F(           "pumps[i].style = 'background-color: red;';\n");
1074
     message += F(       "}\n");
1151
     message += F(       "}\n");
1075
     message += F(    "}\n");
1152
     message += F(    "}\n");
1076
-    
1153
+
1077
     message += F(    "for (let i = 0; i < ");
1154
     message += F(    "for (let i = 0; i < ");
1078
     message += String(SWITCH_COUNT);
1155
     message += String(SWITCH_COUNT);
1079
     message += F("; i++) {\n");
1156
     message += F("; i++) {\n");
1106
     message += F(           "kickstart[i].style = 'background-color: red;';\n");
1183
     message += F(           "kickstart[i].style = 'background-color: red;';\n");
1107
     message += F(       "}\n");
1184
     message += F(       "}\n");
1108
     message += F(    "}\n");
1185
     message += F(    "}\n");
1109
-    
1186
+
1110
     message += F(    "var switchstate = document.getElementById('switchstate');\n");
1187
     message += F(    "var switchstate = document.getElementById('switchstate');\n");
1111
     message += F(    "switchstate.innerHTML = msg.switchstate;\n");
1188
     message += F(    "switchstate.innerHTML = msg.switchstate;\n");
1112
     message += F("};\n");
1189
     message += F("};\n");
1113
     message += F("var hist = document.getElementsByClassName('log')[0];\n");
1190
     message += F("var hist = document.getElementsByClassName('log')[0];\n");
1114
     message += F("hist.scrollTop = hist.scrollHeight;\n");
1191
     message += F("hist.scrollTop = hist.scrollHeight;\n");
1115
-    
1192
+
1116
     message += F("var buttons = document.getElementsByTagName('input');\n");
1193
     message += F("var buttons = document.getElementsByTagName('input');\n");
1117
     message += F("for (let i = 0; i < buttons.length; i++) {\n");
1194
     message += F("for (let i = 0; i < buttons.length; i++) {\n");
1118
     message += F(    "buttons[i].addEventListener('click', updateButton);\n");
1195
     message += F(    "buttons[i].addEventListener('click', updateButton);\n");
1128
 
1205
 
1129
 void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) {
1206
 void webSocketEvent(uint8_t num, WStype_t type, uint8_t *payload, size_t length) {
1130
     if ((type != WStype_TEXT) || (length != 1)) {
1207
     if ((type != WStype_TEXT) || (length != 1)) {
1131
-        debug.println("Websocket: invalid type=" + String(type) + " len=" + String(length) + " data=" + String((char *)payload));
1208
+        debug.println("Websocket: invalid type=" + String(type) + " len=" + String(length) /* + " data=" + String((char *)payload) */ );
1132
         return;
1209
         return;
1133
     }
1210
     }
1134
-    
1211
+
1135
     char c = payload[0];
1212
     char c = payload[0];
1136
     if ((c >= '0') && (c <= '9')) {
1213
     if ((c >= '0') && (c <= '9')) {
1137
         control_act_input(c - '0');
1214
         control_act_input(c - '0');
1154
     debug.println("WiFi: initializing");
1231
     debug.println("WiFi: initializing");
1155
     WiFi.hostname(hostname);
1232
     WiFi.hostname(hostname);
1156
     WiFi.mode(WIFI_STA);
1233
     WiFi.mode(WIFI_STA);
1157
-    
1234
+
1158
     debug.print("WiFi: connecting");
1235
     debug.print("WiFi: connecting");
1159
     WiFi.begin(WIFI_SSID, WIFI_PW);
1236
     WiFi.begin(WIFI_SSID, WIFI_PW);
1160
 
1237
 
1170
     }
1247
     }
1171
     debug.println();
1248
     debug.println();
1172
     debug.println(String("WiFi: status=") + String(WiFi.status()));
1249
     debug.println(String("WiFi: status=") + String(WiFi.status()));
1173
-    
1250
+
1174
 #elif defined(ARDUINO_ARCH_ESP32)
1251
 #elif defined(ARDUINO_ARCH_ESP32)
1175
 
1252
 
1176
     // Set hostname workaround
1253
     // Set hostname workaround
1177
     debug.println("WiFi: set hostname");
1254
     debug.println("WiFi: set hostname");
1178
     WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
1255
     WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
1179
     WiFi.setHostname(hostname.c_str());
1256
     WiFi.setHostname(hostname.c_str());
1180
-    
1257
+
1181
     // Workaround for WiFi connecting only every 2nd reset
1258
     // Workaround for WiFi connecting only every 2nd reset
1182
     // https://github.com/espressif/arduino-esp32/issues/2501#issuecomment-513602522
1259
     // https://github.com/espressif/arduino-esp32/issues/2501#issuecomment-513602522
1183
     debug.println("WiFi: connection work-around");
1260
     debug.println("WiFi: connection work-around");
1207
     }
1284
     }
1208
     debug.println();
1285
     debug.println();
1209
     debug.println(String("WiFi: status=") + String(WiFi.status()));
1286
     debug.println(String("WiFi: status=") + String(WiFi.status()));
1210
-    
1287
+
1211
     // Set hostname workaround
1288
     // Set hostname workaround
1212
     debug.println("WiFi: set hostname work-around");
1289
     debug.println("WiFi: set hostname work-around");
1213
     WiFi.setHostname(hostname.c_str());
1290
     WiFi.setHostname(hostname.c_str());
1236
     MDNS.begin(hostname.c_str());
1313
     MDNS.begin(hostname.c_str());
1237
     updater.setup(&server);
1314
     updater.setup(&server);
1238
     server.on("/", handleRoot);
1315
     server.on("/", handleRoot);
1239
-    
1316
+
1240
 #ifdef ENABLE_GPIO_TEST
1317
 #ifdef ENABLE_GPIO_TEST
1241
     server.on("/gpiotest", handleGpioTest);
1318
     server.on("/gpiotest", handleGpioTest);
1242
 #endif // ENABLE_GPIO_TEST
1319
 #endif // ENABLE_GPIO_TEST
1276
 
1353
 
1277
     socket.begin();
1354
     socket.begin();
1278
     socket.onEvent(webSocketEvent);
1355
     socket.onEvent(webSocketEvent);
1279
-    
1356
+
1280
     debug.println("WiFi: setup done");
1357
     debug.println("WiFi: setup done");
1281
 }
1358
 }
1282
 
1359
 
1290
         last_server_handle_time = millis();
1367
         last_server_handle_time = millis();
1291
         server.handleClient();
1368
         server.handleClient();
1292
         socket.loop();
1369
         socket.loop();
1293
-        
1370
+
1294
 #ifdef ARDUINO_ARCH_ESP8266
1371
 #ifdef ARDUINO_ARCH_ESP8266
1295
         MDNS.update();
1372
         MDNS.update();
1296
 #endif // ARDUINO_ARCH_ESP8266
1373
 #endif // ARDUINO_ARCH_ESP8266
1297
     }
1374
     }
1298
-    
1375
+
1299
     if ((millis() - last_websocket_update_time) >= WEBSOCKET_UPDATE_INTERVAL) {
1376
     if ((millis() - last_websocket_update_time) >= WEBSOCKET_UPDATE_INTERVAL) {
1300
         last_websocket_update_time = millis();
1377
         last_websocket_update_time = millis();
1301
         wifi_send_status_broadcast();
1378
         wifi_send_status_broadcast();
1302
     }
1379
     }
1303
-    
1380
+
1304
 #ifdef ENABLE_GPIO_TEST
1381
 #ifdef ENABLE_GPIO_TEST
1305
     if (runningGpioTest && ((millis() - lastGpioTime) >= GPIO_TEST_INTERVAL)) {
1382
     if (runningGpioTest && ((millis() - lastGpioTime) >= GPIO_TEST_INTERVAL)) {
1306
         gpioTestState = !gpioTestState;
1383
         gpioTestState = !gpioTestState;

Loading…
Cancel
Save