4
This commit is contained in:
172
src/main.cpp
172
src/main.cpp
@@ -25,136 +25,136 @@ static const int WIFI_CONNECT_RETRY_MAX = 30;
|
|||||||
|
|
||||||
void mqtt_callback(char *topic, byte *payload, unsigned int length)
|
void mqtt_callback(char *topic, byte *payload, unsigned int length)
|
||||||
{
|
{
|
||||||
payload[length] = '\0';
|
payload[length] = '\0';
|
||||||
String state((const char *)payload);
|
String state((const char *)payload);
|
||||||
is_disarmed = state == "disarmed";
|
is_disarmed = state == "disarmed";
|
||||||
|
|
||||||
if (state == "armed_away")
|
if (state == "armed_away")
|
||||||
{
|
{
|
||||||
keypad->draw();
|
keypad->draw();
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.println(state);
|
Serial.println(state);
|
||||||
keypad->write(state);
|
keypad->write(state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lock()
|
void lock()
|
||||||
{
|
{
|
||||||
if (is_disarmed)
|
if (is_disarmed)
|
||||||
{
|
{
|
||||||
mqtt->send("ARM_AWAY");
|
mqtt->send("ARM_AWAY");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void unlock()
|
void unlock()
|
||||||
{
|
{
|
||||||
mqtt->send("DISARM");
|
mqtt->send("DISARM");
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isConnecting = false;
|
bool isConnecting = false;
|
||||||
void initWifi(Settings *settings)
|
void initWifi(Settings *settings)
|
||||||
{
|
{
|
||||||
if (!settings)
|
if (!settings)
|
||||||
{
|
{
|
||||||
keypad->write("no settings");
|
keypad->write("no settings");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isConnecting)
|
if (isConnecting)
|
||||||
{
|
{
|
||||||
keypad->write("already connecting");
|
keypad->write("already connecting");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
isConnecting = true;
|
isConnecting = true;
|
||||||
keypad->write("connecting");
|
keypad->write("connecting");
|
||||||
|
|
||||||
WiFi.begin(settings->gettext("wifi:ssid"), settings->gettext("wifi:password"));
|
WiFi.begin(settings->gettext("wifi:ssid"), settings->gettext("wifi:password"));
|
||||||
|
|
||||||
if (WiFi.isConnected())
|
if (WiFi.isConnected())
|
||||||
{
|
{
|
||||||
WiFi.disconnect();
|
WiFi.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
Serial.print("Connecting to Wi-Fi network");
|
Serial.print("Connecting to Wi-Fi network");
|
||||||
for (int cnt_retry = 0; cnt_retry < WIFI_CONNECT_RETRY_MAX && !WiFi.isConnected();
|
for (int cnt_retry = 0; cnt_retry < WIFI_CONNECT_RETRY_MAX && !WiFi.isConnected();
|
||||||
cnt_retry++)
|
cnt_retry++)
|
||||||
{
|
{
|
||||||
delay(500);
|
delay(500);
|
||||||
Serial.print(".");
|
Serial.print(".");
|
||||||
}
|
}
|
||||||
Serial.println("");
|
Serial.println("");
|
||||||
if (WiFi.isConnected())
|
if (WiFi.isConnected())
|
||||||
{
|
{
|
||||||
Serial.print("Local IP: ");
|
Serial.print("Local IP: ");
|
||||||
Serial.println(WiFi.localIP());
|
Serial.println(WiFi.localIP());
|
||||||
isConnecting = false;
|
isConnecting = false;
|
||||||
keypad->write("connected");
|
keypad->write("connected");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
keypad->write("failed to connect");
|
keypad->write("failed to connect");
|
||||||
isConnecting = false;
|
isConnecting = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initTOTP(Settings *settings)
|
void initTOTP(Settings *settings)
|
||||||
{
|
{
|
||||||
uint8_t *base32_key = new uint8_t[20];
|
uint8_t *base32_key = new uint8_t[20];
|
||||||
const char *hmac = ((String)settings->gettext("totp:hmac")).c_str();
|
const char *hmac = ((String)settings->gettext("totp:hmac")).c_str();
|
||||||
|
|
||||||
for (int i = 0; i < 20; i++)
|
for (int i = 0; i < 20; i++)
|
||||||
{
|
{
|
||||||
base32_key[i] = (uint8_t)hmac[i];
|
base32_key[i] = (uint8_t)hmac[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
TOTP(base32_key, 20, 30);
|
TOTP(base32_key, 20, 30);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
M5.begin();
|
M5.begin();
|
||||||
|
|
||||||
keypad = new Keypad();
|
keypad = new Keypad();
|
||||||
keypad->write("loading");
|
keypad->write("loading");
|
||||||
|
|
||||||
auto settings = new Settings();
|
auto settings = new Settings();
|
||||||
|
|
||||||
if (!settings)
|
if (!settings)
|
||||||
{
|
{
|
||||||
keypad->write("unable to load settings");
|
keypad->write("unable to load settings");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mqtt = new MQTT(settings, mqtt_callback);
|
mqtt = new MQTT(settings, mqtt_callback);
|
||||||
|
|
||||||
initWifi(settings);
|
initWifi(settings);
|
||||||
mqtt->connect();
|
mqtt->connect();
|
||||||
timeClient.begin();
|
timeClient.begin();
|
||||||
initTOTP(settings);
|
initTOTP(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
void submit(String code)
|
void submit(String code)
|
||||||
{
|
{
|
||||||
uint32_t newCode = getCodeFromTimestamp(timeClient.getEpochTime());
|
uint32_t newCode = getCodeFromTimestamp(timeClient.getEpochTime());
|
||||||
uint32_t input = code.toInt();
|
uint32_t input = code.toInt();
|
||||||
|
|
||||||
if (newCode == input)
|
if (newCode == input)
|
||||||
{
|
{
|
||||||
unlock();
|
unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
lock();
|
lock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
timeClient.update();
|
timeClient.update();
|
||||||
mqtt->loop();
|
mqtt->loop();
|
||||||
|
|
||||||
auto value = keypad->get_input();
|
auto value = keypad->get_input();
|
||||||
if (value.has_value())
|
if (value.has_value())
|
||||||
submit(value.value());
|
submit(value.value());
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user