26 while (*p && isspace((
unsigned char)*p)) ++p;
27 if (p != s) memmove(s, p, strlen(p) + 1);
30 size_t len = strlen(s);
31 while (len > 0 && isspace((
unsigned char)s[len - 1]))
51 ThingSpeak.begin(client);
57 if (!
config.flags.thingSpeakEnabled)
return false;
61 unsigned long now = millis();
67 strlcpy(apiKeyBuf,
config.thingSpeakApiKey,
sizeof(apiKeyBuf));
68 strlcpy(channelBuf,
config.thingSpeakChannelId,
sizeof(channelBuf));
72 unsigned long channelId = strtoul(channelBuf,
nullptr, 10);
75 if (channelId == 0 || strlen(apiKeyBuf) < 16)
80 logWarn(
"ThingSpeak: настройки не заданы (Channel ID: %s, API Key: %d символов)",
81 channelBuf, strlen(apiKeyBuf));
96 logData(
"Отправка в ThingSpeak: T=%.1f°C, H=%.1f%%, PH=%.2f",
99 int res = ThingSpeak.writeFields(channelId, apiKeyBuf);
110 else if (res == -301)
112 logWarn(
"ThingSpeak: таймаут (-301), повторим позже");
115 else if (res == -401)
117 logDebug(
"ThingSpeak: превышен лимит публикаций");
120 else if (res == -302)
122 logError(
"ThingSpeak: неверный API ключ");
125 else if (res == -304)
127 logError(
"ThingSpeak: неверный Channel ID");
132 logError(
"ThingSpeak: ошибка подключения");
137 logError(
"ThingSpeak: HTTP 400 – неверный запрос (проверьте API Key/Channel)");
142 logError(
"ThingSpeak: ошибка %d", res);
void logDebug(const char *format,...)
void logWarn(const char *format,...)
void logSuccess(const char *format,...)
void logError(const char *format,...)
void logData(const char *format,...)
Система логгирования с красивым форматированием
static unsigned long lastTsPublish
static void trim(char *s)
static char thingSpeakLastErrorBuffer[64]
bool sendDataToThingSpeak()
static char thingSpeakLastPublishBuffer[32]
const char * getThingSpeakLastPublish()
const char * getThingSpeakLastError()
static int consecutiveFailCount
void setupThingSpeak(WiFiClient &client)
const char * THINGSPEAK_API_URL