| @ -0,0 +1,158 @@ | |||||
| /* | |||||
| main_pilot_wire_control.ino | |||||
| Switches on or off several heaters. | |||||
| */ | |||||
| #include "EspMQTTClient.h" | |||||
| EspMQTTClient client( | |||||
| "rico2", | |||||
| "xxxxx", | |||||
| "192.168.1.2", // MQTT Broker server ip | |||||
| "", // Can be omitted if not needed | |||||
| "", // Can be omitted if not needed | |||||
| "pilote-general", // Client name that uniquely identify your device | |||||
| 1883 // The MQTT port, default to 1883. this line can be omitted | |||||
| ); | |||||
| enum rooms { | |||||
| LIVING_ROOM, | |||||
| ROOM_SO, | |||||
| ROOM_RICO, | |||||
| BATHROOM, | |||||
| NB_HEATERS | |||||
| }; | |||||
| struct heater { | |||||
| int pin; | |||||
| enum rooms room; | |||||
| const char *topic; | |||||
| MessageReceivedCallback callback; | |||||
| os_timer_t keep_alive_timer; | |||||
| }; | |||||
| static struct heater heaters[NB_HEATERS]; | |||||
| const int heating_pin = 14; | |||||
| #define heater_on(pin) do {\ | |||||
| digitalWrite(pin, LOW); \ | |||||
| } while(0) | |||||
| #define heater_off(pin) do {\ | |||||
| digitalWrite(pin, HIGH); \ | |||||
| } while(0) | |||||
| void reset_timer(enum rooms room) | |||||
| { | |||||
| os_timer_t *timer = &(heaters[room].keep_alive_timer); | |||||
| os_timer_disarm(timer); | |||||
| os_timer_setfn(timer, shutdown_heater, &(heaters[room].room)); | |||||
| os_timer_arm(timer, 3600000, false); | |||||
| } | |||||
| void handle_message(enum rooms room, const String &message) | |||||
| { | |||||
| Serial.println(message); | |||||
| if (message == "off") { | |||||
| heater_off(heaters[room].pin); | |||||
| } | |||||
| if (message == "on") { | |||||
| heater_on(heaters[room].pin); | |||||
| } | |||||
| reset_timer(room); | |||||
| } | |||||
| void living_room_callback(const String &message) | |||||
| { | |||||
| handle_message(LIVING_ROOM, message); | |||||
| } | |||||
| void room_so_callback(const String &message) | |||||
| { | |||||
| handle_message(ROOM_SO, message); | |||||
| } | |||||
| void room_rico_callback(const String &message) | |||||
| { | |||||
| handle_message(ROOM_RICO, message); | |||||
| } | |||||
| void bathroom_callback(const String &message) | |||||
| { | |||||
| handle_message(BATHROOM, message); | |||||
| } | |||||
| void shutdown_heater(void *arg) | |||||
| { | |||||
| enum rooms room = *(enum rooms *)arg; | |||||
| // if we didn't receive a message for an hour, | |||||
| // shutdown the heater | |||||
| Serial.print("No MQTT message for one hour on topic "); | |||||
| Serial.print(heaters[room].topic); | |||||
| Serial.println(", switching off."); | |||||
| heater_off(heaters[room].pin); | |||||
| } | |||||
| void setup() | |||||
| { | |||||
| unsigned i; | |||||
| heaters[LIVING_ROOM].room = LIVING_ROOM; | |||||
| heaters[ROOM_SO].room = ROOM_SO; | |||||
| heaters[ROOM_RICO].room = ROOM_RICO; | |||||
| heaters[BATHROOM].room = BATHROOM; | |||||
| heaters[LIVING_ROOM].pin = 14; | |||||
| heaters[ROOM_SO].pin = 13; | |||||
| heaters[ROOM_RICO].pin = 12; | |||||
| heaters[BATHROOM].pin = 4; | |||||
| heaters[LIVING_ROOM].topic = "chauffage/salon"; | |||||
| heaters[ROOM_SO].topic = "chauffage/chambre_rico"; | |||||
| heaters[ROOM_RICO].topic = "chauffage/chambre_so"; | |||||
| heaters[BATHROOM].topic = "chauffage/sdb"; | |||||
| heaters[LIVING_ROOM].callback = living_room_callback; | |||||
| heaters[ROOM_SO].callback = room_so_callback; | |||||
| heaters[ROOM_RICO].callback = room_rico_callback; | |||||
| heaters[BATHROOM].callback = bathroom_callback; | |||||
| for (i = 0; i < NB_HEATERS; i++) { | |||||
| pinMode(heaters[i].pin, OUTPUT); | |||||
| heater_off(heaters[i].pin); | |||||
| } | |||||
| Serial.begin(115200); | |||||
| // Optionnal functionnalities of EspMQTTClient : | |||||
| client.enableDebuggingMessages(); // Enable debugging messages sent to serial output | |||||
| client.enableHTTPWebUpdater(); // Enable the web updater. User and password default to values of MQTTUsername and MQTTPassword. These can be overrited with enableHTTPWebUpdater("user", "password"). | |||||
| for (i = 0; i < NB_HEATERS; i++) { | |||||
| os_timer_setfn(&(heaters[i].keep_alive_timer), shutdown_heater, &(heaters[i].room)); | |||||
| os_timer_arm(&(heaters[i].keep_alive_timer), 3600000, false); | |||||
| } | |||||
| } | |||||
| // This function is called once everything is connected (Wifi and MQTT) | |||||
| // WARNING : YOU MUST IMPLEMENT IT IF YOU USE EspMQTTClient | |||||
| void onConnectionEstablished() | |||||
| { | |||||
| for (unsigned i = 0; i < NB_HEATERS; i++) { | |||||
| client.subscribe(heaters[i].topic, heaters[i].callback); | |||||
| } | |||||
| } | |||||
| void loop() | |||||
| { | |||||
| client.loop(); | |||||
| if (!client.isConnected()) { | |||||
| // if something wrong happens, switch off the heater | |||||
| for (unsigned i = 0; i < NB_HEATERS; i++) { | |||||
| heater_off(heaters[i].pin); | |||||
| } | |||||
| } | |||||
| } | |||||