Справочник виджетов
Полный набор виджетов — код использования для копипаста в скетч, живой рендер и размеры ячеек S/M/L. UI для поделки за минуты.
Каждая карточка на сетке — один из трёх размеров; у типа есть дефолт, переопределяется .size(). Большие виджеты (график, gauge) — на L.
Одно значение или контрол — metric, badge, toggle, LED. По 4 в ряд на мобильном.
dash.metric("Temp", &t) Нужна ширина — slider, progress, select, text.
dash.slider("PWM", &v, 0, 255) На всю ширину, выше — график, gauge, карта, лог, таблица. Большим данным — большая карточка.
dash.chart("Temp", &t).size(RSIZE_L) Один код — на любой ESP. А со встроенными фейк-датчиками весь UI можно собрать до того, как приедет плата.
живой рендер — все виджеты в UI устройства
Свой «хром» либа переводит сама; dash.translate() переводит твои строки — заголовки виджетов, имена страниц, опции селектов. Выбери язык — и заголовки тоже переключатся (арабский разворачивается в RTL):
http://192.168.4.1/?lang=en
// Your strings, localized at render time. English is the source.
struct Row { const char *en, *ru, *uz, *ar; };
static const Row DICT[] = {
{"Temperature", "Температура", "Harorat", "الحرارة"},
{"System", "Система", "Tizim", "النظام"},
/* …one row per author string… */
};
const char *tr(const char *s, const char *lang) {
int col = lang[0]=='r'?1 : (lang[0]=='u'&&lang[1]=='z')?2
: lang[0]=='a'?3 : 0;
if (col == 0) return s; // English → as written
for (auto &r : DICT)
if (!strcmp(r.en, s)) return col==1?r.ru:col==2?r.uz:r.ar;
return s; // unmapped → leave it
}
void setup() {
dash.translate(tr); // register once — that's it
dash.gauge("Temperature", &t, 0, 50, "C");
} Один хук на все авторские строки: заголовки виджетов, имена страниц/групп/вкладок, подписи кнопок и опции селектов. Ноль накладных расходов, пока не вызван dash.translate().
На LCD-панели тот же принцип с одним честным ограничением: штатный шрифт — только латиница, поэтому экран показывает en / uz нативно и откатывается на английский для ru / ar — тогда как этот веб-дашборд отдаёт все четыре.
Скопируй одну строку нужного виджета. Чип показывает дефолтный размер ячейки (S/M/L).
dash.metric("CPU", &cpu, "%") Большое число + бар. Базовый показ величины.
in ESPUIdash.gauge("Voltage", &v, 0, 14, "V") Круговой индикатор с зонами. (нет в ESPUI)
RisalDash onlydash.chart("Temp", &t, "°C").history(60) График временного ряда. (нет в ESPUI)
RisalDash onlydash.badge("State", &st) Цветной статус: ok/warn/bad, online/offline. (нет в ESPUI)
RisalDash onlydash.label("Status", &statusStr) Текстовая строка состояния (может содержать HTML).
in ESPUIdash.led("Link", &linkUp) Точка-индикатор вкл/выкл. (нет в ESPUI)
RisalDash onlydash.face("Mood", &mood) Анимированные глаза робота: 10 эмоций + моргание, реагируют на переменную/AI-агента. (нет в ESPUI)
RisalDash onlydash.cube("Orientation", &pitch, &roll, &yaw) 3D-куб вращается по углам IMU (MPU6050/9250) — наглядная ориентация. (нет в ESPUI)
RisalDash onlydash.heatmap("Thermal", 32, 24) Тепловая карта (canvas, jet-colormap) — MLX90640 32×24 или любое 2D-поле. (нет в ESPUI)
RisalDash onlydash.progress("Upload", &pct) Прогресс операции 0–100%. (нет в ESPUI)
RisalDash onlydash.table("System").row("uptime",&up) Пары ключ-значение: системная инфа. (нет в ESPUI)
RisalDash onlydash.log("Events", 5).print("...") Прокручиваемый журнал событий. (нет в ESPUI)
RisalDash onlydash.image("Cam", "/snapshot.jpg") Картинка/снимок с камеры по URL.
in ESPUIdash.ai("Light turns off at 23:00") Плашка подсказки от AI-агента. (фишка RisalDash)
RisalDash onlydash.map("Track", &lat, &lon) Живая карта (Leaflet, тёмная тема) с маркером и треком. GPS-трекеры, маршруты. (нет в ESPUI)
RisalDash onlydash.toggle("Pump", &pump, [](bool v){...}) Вкл/выкл реле, насос, свет. Главный контрол автоматизации.
in ESPUIdash.button("Restart", [](){ ESP.restart(); }) Разовое действие: рестарт, калибровка, сброс счётчика.
in ESPUIdash.slider("Brightness", &pwm, 0, 255) Плавная величина: яркость, скорость, порог.
in ESPUIdash.number("Setpoint", &target, 0, 100) Точный числовой ввод с min/max и шагом.
in ESPUIdash.text("SSID", &ssid) Строка: имя сети, MQTT-топик, метка устройства.
in ESPUIdash.textarea("Notes", ¬es) Многострочный текст: заметки, JSON, небольшой конфиг. (нет в ESPUI)
RisalDash onlydash.password("WiFi pass", &pass) Скрытый ввод для паролей/токенов. (нет в ESPUI)
RisalDash onlydash.select("Mode", &mode, {"Auto","Manual","Off"}) Выбор одного из вариантов: режим работы.
in ESPUIdash.radio("Fan", &lvl, {"Low","Mid","High"}) Взаимоисключающий выбор кнопками. (нет в ESPUI)
RisalDash onlydash.color("LED color", &rgb) Выбор цвета для RGB-лент/подсветки. (нет в ESPUI)
RisalDash onlydash.time("Alarm", &alarmTime) Установка времени/даты: будильник, расписание.
in ESPUIdash.pad("Drive", [](int dir){...}) Крестовина управления: робот, камера, машинка.
in ESPUIdash.joystick("Move", [](int x,int y){...}) Аналоговый 2D-ввод X/Y. (расширение Pad)
RisalDash onlydash.stepper("Count", &n, 1) Инкремент/декремент кнопками −/+. (нет в ESPUI)
RisalDash onlydash.ota("Firmware") Загрузка файла/прошивки через браузер. (нет в ESPUI)
RisalDash onlydash.terminal("Shell", handleCmd) Консоль: вывод + ввод команд по WebSocket. Отладка/управление с дашборда. (нет в ESPUI)
RisalDash onlydash.radioBrowser("Stations", &listText, [](const String& v){ playFirst(v); }) Редактируемый список интернет-радиостанций — перетаскивание для сортировки, инлайн-правка имени/URL, добавление/удаление. Значение — «Name | URL | Meta» построчно; работает с плеером на кодеке ES8311. (нет в ESPUI)
RisalDash onlydash.group("Power") Секция, объединяющая виджеты визуально.
in ESPUIdash.tab("Sensors") Вкладка для разделения большого дашборда.
in ESPUIdash.separator("Settings") Разделитель с подписью между блоками.
in ESPUIwidget.span(2) Растянуть карточку на N колонок сетки. (нет в ESPUI)
RisalDash only