|
|
@ -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); |
|
|
|
} |
|
|
|
} |
|
|
|
} |