mirror of https://github.com/arendst/Tasmota.git
103 lines
3.7 KiB
C++
103 lines
3.7 KiB
C++
/*
|
|
xdrv_96_blacklist.ino - Blacklist for Tasmota
|
|
|
|
SPDX-FileCopyrightText: 2022 Theo Arends
|
|
|
|
SPDX-License-Identifier: GPL-3.0-only
|
|
*/
|
|
|
|
#define USE_BLACKLIST
|
|
|
|
#ifdef USE_BLACKLIST
|
|
/*********************************************************************************************\
|
|
* Blacklist support
|
|
*
|
|
* Check language and user set latitude/longitude against blacklist table
|
|
\*********************************************************************************************/
|
|
|
|
#define XDRV_96 96
|
|
|
|
typedef struct {
|
|
int16_t latitude_tl; // - 8999 to 8999
|
|
int16_t longitude_tl; // -17999 to 17999
|
|
int16_t latitude_br;
|
|
int16_t longitude_br;
|
|
uint16_t lcid;
|
|
} tBlArray;
|
|
|
|
//const char BlacklistText[] PROGMEM = "Stop war - Free Ukrain|Stop war - Free Ukrain|";
|
|
const char BlacklistText[] PROGMEM = "Stop war, Free Ukrain";
|
|
|
|
// lat_tl lon_tl lat_br lon_br lcid
|
|
tBlArray BlArray[] { 5900, 3200, 5300, 4400, 1049, // Around Moscow
|
|
5450, 2633, 5280, 2900, 1049 // Around Minsk
|
|
};
|
|
|
|
uint8_t blist_show = 0;
|
|
|
|
void BListEverySecond(void) {
|
|
if (Rtc.utc_time < 1648771200) { // Only until 2022-04-01
|
|
if (0 == (TasmotaGlobal.uptime % 20)) { // Only every 20 seconds
|
|
if (TasmotaGlobal.power) { // Only if any power on
|
|
uint32_t latitude = Settings->latitude / 10000;
|
|
uint32_t longitude = Settings->longitude / 10000;
|
|
uint32_t count = sizeof(BlArray) / sizeof(tBlArray);
|
|
for (uint32_t i = 0; i < count; i++) {
|
|
// Currently only supports top-right quarter of the earth
|
|
if ((LANGUAGE_LCID == BlArray[i].lcid) && // Check language id
|
|
(latitude < BlArray[i].latitude_tl) && // Check user set latitude and longitude against table
|
|
(latitude > BlArray[i].latitude_br) &&
|
|
(longitude > BlArray[i].longitude_tl) &&
|
|
(longitude < BlArray[i].longitude_br)) {
|
|
|
|
// char bl_text[100];
|
|
// snprintf_P(bl_text, sizeof(bl_text), PSTR("Power0 0")); // Turn all power off - annoying
|
|
// snprintf_P(bl_text, sizeof(bl_text), PSTR("Restart 1")); // Restart - more annoying
|
|
// snprintf_P(bl_text, sizeof(bl_text), PSTR("Reset 1")); // Reset - disastrous
|
|
// ExecuteCommand(bl_text, SRC_IGNORE);
|
|
|
|
// char bl_text[100];
|
|
// AddLog(LOG_LEVEL_NONE, PSTR("**** %s ****"), GetTextIndexed(bl_text, sizeof(bl_text), i, BlacklistText));
|
|
AddLog(LOG_LEVEL_NONE, PSTR("**** %s ****"), BlacklistText);
|
|
blist_show = i +1; // Set GUI message id
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
} else if (0 == (TasmotaGlobal.uptime % 10)) { // Only every 10 seconds
|
|
blist_show = 0; // Reset GUI message id after 10 seconds
|
|
}
|
|
}
|
|
}
|
|
|
|
void BListShow(bool json) {
|
|
if (blist_show) {
|
|
// char bl_text[100];
|
|
// WSContentSend_PD(PSTR("{s}**** %s ****{m}{e}"), GetTextIndexed(bl_text, sizeof(bl_text), blist_show -1, BlacklistText));
|
|
WSContentSend_P(PSTR("{s}**** %s ****{m}{e}"), BlacklistText);
|
|
}
|
|
}
|
|
|
|
/*********************************************************************************************\
|
|
* Interface
|
|
\*********************************************************************************************/
|
|
|
|
bool Xdrv96(uint8_t function) {
|
|
bool result = false;
|
|
|
|
switch (function) {
|
|
case FUNC_EVERY_SECOND:
|
|
BListEverySecond();
|
|
break;
|
|
#ifdef USE_WEBSERVER
|
|
case FUNC_WEB_SENSOR:
|
|
BListShow(0);
|
|
break;
|
|
#endif // USE_WEBSERVER
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
#endif // USE_BLACKLIST
|