Для обработки данных на локальном сервере есть возможность разрабатывать собственные скрипты на языке javscript. Скрипты располагаются в директории /var/lib/wliotproxyd/js_data_processing/. Каждый скрипт запускается сервером в выделенном окружении и работает независимо от других. Пользователь может, используя консольный клиент, останавливать и запускать скрипты, при этом при перезапуске сервер считывает код скрипта заново, что позволяет модифицировать код без перезапуска всего сервера.
При разработке скрипта пользователю доступен API, позволяющий получать доступ к устройствам и хранилищам данных. В частности, скрипт может запрашивать данные из базы, получать уведомления о поступлении новых данных, посылать команды устройствам и т.д. Более подробно API описан в протоколе взаимодействия с локальным сервером.
В описании API для некоторых объектов указан список сигналов. Это идеология, которая пришла из фреймворка Qt, который используется для разработки самого сервера. В целом механизм аналогичен callback-функциям. Для примера можно рассмотреть обработку сигнала newValueWritten от хранилища, который генерируется при появлении новых данных:
В данном примере запрашивается хранилище inStorage из базы хранилищ, и с помощью вызова inStorage.newValueWritten.connect добавляется обработчик. Каждый раз, когда в хранилище поступает новое значение, будет вызвана функция-обработчик, переданная в вызов connect. Если передать не анонимную функцию, а именованную, то в дальнейшем можно вызвать аналогичный метод disconnect, чтобы убрать обработчик.
Разработчик скрипта может зарегистрировать на сервере вирутальное устройство, указав для него список датчиков и (опционально) описание интерфейса управления в xml формате. Это устройство может применяться в двух случаях:
inStorage.newValueWritten.connect(function(value)
{
try
{
print("NEW VALUE: ");
print("1");
print(value.data);
print("2");
device.writeMeasurement("result",[value.data[0]+Math.random()]);
print("3");
}
catch(e)
{
print("4");
print(e.message);
}
finally
{
print("DONE");
}
});