LINUX.ORG.RU

Вебные аналого-цифровые индикаторы.

 , копрофагия


8

2

По итогам Есть ли что-то типа Grafana только на порядки легче и проще?

Написал ещё тогда и забыл. Ну пусть новогодний подарочек будет.

Продолжаем делать правильный вебдваноль. Как обычно, всё очень маленькое (2.5kb) и шустрое, на plain JS без каких-либо «фреймворков» и прочего многотонного жирного говна. Легко влезает в эмбедщину всякую и т.п.

Итак…

gauge.js

'use strict'

function Gauges( class_name )
{
    var _ = this;
    _.urls = [];
    var gauge = document.getElementsByClassName( class_name );
    for( var j = gauge.length; j--; )
    {
        var e = gauge.item(j);
        var g = JSON.parse( e.getAttribute( "data-conf" ) );
        if( !g ) return;

        g.id = e.id;
        g.title = e.title;
        e.removeAttribute( 'title' );

        var c = g.size / 2;
        var r = 0.8 * c;
        var l = 2 * Math.PI * r;

        for( var i = _.urls.length; i--; ) { if( _.urls[i].url == g.url ) break; }
        if( i < 0 ) _.urls.push( { url: g.url, gauges: [ g ] } );
        else        _.urls[i].gauges.push( g );

        e.innerHTML =
            '<svg width="' + g.size + '" height="' + g.size + '">'
          + '<circle class="gauge-bg" id="' + g.id + '-bg" cx="' + c + '" cy="' + c + '" r="' + r + '" stroke-dasharray="' + ( 2 * l / 3 ) + " " + ( l / 3 ) + '" stroke-dashoffset="' + ( -5 * l / 12 ) + '"/>'
          + '<circle class="gauge-pnt" id="' + g.id + '-pnt" cx="' + c + '" cy="' + c + '" r="' + r + '" stroke="' + g.color + '" stroke-width="' + ( 0.1 * g.size ) + '" stroke-dasharray="0 1"/>'
          + '<text class="gauge-val" id="' + g.id + '-val" fill="' + g.color + '" x="' + c + '" y="' + ( 1.1 * c ) + '" font-size="' + ( 0.45 * r ) + '" text-anchor="middle"></text>'
          + '<text class="gauge-title" x="' + c + '" y="' + ( c + r ) + '">' + g.title + '</text>'
          + '</svg>';
    }

    _.urls.forEach( function( u )
    {
        _.update( u );
        setInterval( function(){ _.update( u ) }, u.gauges[0].int );
    } );
}

Gauges.prototype.set = function( id, min, max, val )
{
    var e = document.getElementById( id + '-pnt' );
    if( !e ) return;

    var r = e.getAttribute( 'r' );
    var l = 2 * Math.PI * r;
    var v = val < min ? min : val > max ? max : val;
    var dash = ( 2 / 3 ) * l * ( v - min ) / ( max - min );

    e.setAttribute( 'stroke-dasharray', [ dash, l - dash ]);
    e.setAttribute( 'stroke-dashoffset', (-5 / 12) * l );

    document.getElementById( id + "-val" ).textContent = val;
}

Gauges.prototype.update = function( u )
{
    var _ = this;
    var req = new XMLHttpRequest();
    req.onreadystatechange = function()
    {
        if( this.readyState != 4 ) return;
        var obj = JSON.parse( this.responseText );
        if( !obj ) return;
        u.gauges.forEach( function( g )
        {
            var v = g.path.split('.').reduce( function( o, k ) { return o && o[k] }, obj );
            _.set( g.id, g.min, g.max, v.toFixed( g.prec ) );
        } );
    };
    req.open( "GET", u.url );
    req.send();
}

gauge.css

@font-face {
    font-family: "7SEG";
    src: url("DSEG7Classic-BoldItalic.ttf") format("opentype");
}

.gauge-pnt {
  fill: transparent;
}

.gauge-bg {
  stroke: #808080;
  stroke-width: 1px;
  fill: transparent;
}

.gauge-val {
    font-family: "7SEG", serif;
}

.gauge-title {
    text-anchor: middle;
    fill: #C0C0C0;
}

Шрифт DSEG7Classic-BoldItalic.ttf ради прикола, можно из дебиановского пакета fonts-dseg взять. Или в формате woff2, он размером поменьше будет.

Как использовать:

<HTML>
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" content="no-cache">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=utf-8">
<LINK rel="stylesheet" type="text/css" href="gauge.css">
<SCRIPT src="gauge.js" type="text/javascript"></SCRIPT>
<SCRIPT>
var ups_gauges;
window.addEventListener( 'load', function() { ups_gauges = new Gauges( 'ups' ); }, false );
</SCRIPT>
<STYLE>
a.ups { outline: none; }
body { background-color: #000000; color: #c0c0c0; }
</STYLE>
<TITLE>Gauge</TITLE>
</HEAD>
<BODY>
<a href="ups/voltage.html" class="ups" title="UPS Vin, V"  id="Vin" data-conf='{"url":"data/ups.json","path":"Vin","int":20000,"min":0,"max":300,"prec":0,"color":"#40C040","size":150}'></a>
<a href="ups/load.html"    class="ups" title="UPS Load, %" id="Load" data-conf='{"url":"data/ups.json","path":"Load","int":20000,"min":0,"max":100,"prec":0,"color":"#C040C0","size":150}'></a>
<a href="ups/temp.html"    class="ups" title="UPS T, °C"   id="Temp" data-conf='{"url":"data/ups.json","path":"Temp","int":20000,"min":0,"max":100,"prec":1,"color":"#C0C0C0","size":150}'></a>
</BODY>

data/ups.json

{ "Vin": 193.2, "Load": 40, "Temp": 38.0 }

В аттрибут data-conf элемента который превращаем в индикатор пишем JSON где

url - URL источника данных для индикатора в формате JSON
path - "путь" в JSON до нужной величины, например "sensors.0.temp"
int - интервал обновления в миллисекундах
min - минимальное значение аналоговой шкалы индикатора
max - максимальное значение аналоговой шкалы индикатора
prec - число цифр после запятой для цифрового индикатора 
color - цвет индикатора
size - размер индикатора

У элементов превращаемых в индикаторы должен быть установлен аттрибут id.

В аттрибуте title указывается подпись под индикатором.

Элементам индикаторов одной группы присваеваем один класс и его имя передаём в конструктор new Gauges('class_name') когда нужно создать и запустить индикаторы.

Если у нескольких индикаторов одного и того же класса URL источника данных одинаковый, то запрос к этому URL при периодическом обновлении будет только один, но при этом будут обновлены все индикаторы этого класса с этим URL.

Выглядит так: http://stanson.ch/gauges.png

Лицнзия WTFPL

★★★★★

Последнее исправление: Stanson (всего исправлений: 8)

Ответ на: комментарий от TDrive

Это ошибки, они приводят к проблемам, я даже написал проблемы.

Разве что у безмозглых макак. Но они не являются целевой аудиторией высера вообще.

Гореть будут те кто будет работать с твоим кодом после тебя и это явно не я.

Тогда зачем вообще 2 страницы? :) «Я бежала за Вами 2 квартала чтобы сообщить как Вы мне безразличны» :)

Какой проблемы?

С вебом.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Тогда зачем вообще 2 страницы? :) «Я бежала за Вами 2 квартала чтобы сообщить как Вы мне безразличны» :)

Я пришел сюда, что бы общаться, чем и занимался эти 2 страницы. Ты не понимаешь зачем нужны форумы?

С вебом.

Если с вебом и есть проблемы твой высер ни как их не решает. Это даже не попытка.

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Если с вебом и есть проблемы твой высер ни как их не решает.

Но он, внезапно, прекрасно решил. И похоже решил проблемы ещё нескольких пассажиров. :)

Stanson ★★★★★
() автор топика
Ответ на: комментарий от TDrive

Какие проблемы с вебом он решает?

Жирность, тормоза, неригодность для допиливания под свои нужды, использование всяких блоатварных фреймворков и т.п.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

так ты же сам признал что у тебя врайтонли код, как раз не пригоден для допиливания под свои нужды

TDrive ★★★★★
()
Ответ на: комментарий от Stanson

Ты вообще пробовал проверить свой код на озвученные проблемы веба или априори считаешь любой свой высер гениальным?) Он так то и по критерию тормозов и жирности не проходит из за использования древних технологий ради поддержки мертвых браузеров))

Но фреимворков нету, в 1 из 4 ты попал) молодец)

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

У нас разные понятия о «writeonly».

Для меня writeonly - это такой код, который можно за 5 минут допилить под свои нужды и больше никогда его не трогать. Не заниматься всяким ненужным говном типа рефакторинга, внедрения ненужных новшеств ради внедрения ненужных новшеств и прочим идиотизмом.

И мне совершенно насрать, что там у вебмакак называется writeonly.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Ну ты же не споришь с тем, что твой код можно было написать в более пригодном для чтения виде ничего не потеряв при этом? Это один из важнейших критериев пригодности для допиливания. Ты на него положил болт. Так что….

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Ты вообще пробовал проверить свой код на озвученные проблемы веба или априори считаешь любой свой высер гениальным?

Во-первых, жабоскриптный высер гениальным быть никак не может, потому что он элементарен. Во-вторых, разумеется я проверил и ужор памяти и скорость выполнения по сравнению с теми жуткими вебмакачьими поделиями которые удалось найти.

Если ты уже забыл, я начал вовсе не с написания высера, а с поиска чего-либо что я мог бы использовать. Как и в случае с Dash-плеером, вебмакаки могли предложить только жирное говно с совершенно ненужными зависимостями. И только тогда я написал этот высер.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Ты про графану что ли? То что ты написал не является конкурентом графаны) Ну а вообще, индивидуальные решения всегда эффективнее универсальных, в этом нету ничего неожиданного.

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Ну ты же не споришь с тем, что твой код можно было написать в более пригодном для чтения виде ничего не потеряв при этом?

Способности вебмакак и апологетов monkey development к чтению чужого кода для них не предназначенного - это самое последнее о чём я бы мог когда-либо подумать.

Это один из важнейших критериев пригодности для допиливания.

Мой код отлично пригоден для допиливания. Помещается на экран целиком, не использует километровые названия переменных и функций, прост как 3 копейки и не использует всяких новомодных фич, которые затруднили бы понимание кода целевой аудиторией, которая не является вебмакаками дрочащими на самые распоследние фичи языка и штудирующими все высеры организаций эти фичи перманентно наваливающих во вполне законченный и достаточно древний скриптовый язычок. Чтобы допилить этот высер, достаточно базовых знаний о программировании, которые однозначно есть у тех, кому этот высер может понадобиться. Именно поэтому он написан в c-like стиле, без какого-либо современного синтаксического сахара.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от TDrive

Ты про графану что ли?

В том числе. Есть немало реализаций подобно выглядящих штук, даже отдельных, но они вообще не заточены для применения как индикаторы для датчиков. Это либо идиотские свистелки и перделки с анимацией и т.п. для использования вместо спиннеров всяких (проценты загрузки страницы и прочий подобный невменяемый дебилизм), либо какие-то попытки полностью скопировать внешний вид реального аналогового индикатора, со всей вытекающей жирностью. Что-либо мало-мальски подходящее и способное к работе с источниками данных искаропки непременно было жирным и с кучей зависимостей, типа графаны.

То что ты написал не является конкурентом графаны)

Является. Я дофига насмотрелся на всяких специализированных форумах и бложеках советы типа «отображаем показания уличного датчика влажности в браузере», где ради одного сраного индикатора предлагалось использовать графану. Именно поэтому я и полез смотреть на этот ужас, и именно поэтому у меня и возникли вопросы.

Вообще, такое впечатление, что многие считают веб априори жирным тормозным говном вообще и что использование графаны для отрисовывания нескольких индикаторов это нормально. И даже не пытаются задавать вопросы. Я всего лишь хочу продемонстрировать тем, у кого есть необходимость в прикладном (для решения реальных практических задач из реального мира, а не веба ради веба в вебе про веб) использовании веб-технологий, что это не обязательно жирное уродливое говно, и что веб-технологии вполне могут быть маленькими, быстрыми и очень простыми в использовании, и что тот, кто осилил написание прошивки для какого-нибудь ESP32 более чем способен так же осилить написание веб-морды, причём это будет быстрее и качественнее чем использование жирных убогих и невменяемых поделий вебмакак.

Stanson ★★★★★
() автор топика
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Способности вебмакак и апологетов monkey development к чтению чужого кода для них не предназначенного - это самое последнее о чём я бы мог когда-либо подумать.

Ты свой код от скрипткидди защищаешь что ли?)) Чем больше людей смогут допилить твой код под свои нужды тем больше он пригоден для допиливания под свои нужды.

Я уже как будто ребенку объясняю)

не использует километровые названия переменных и функций

Да, у тебя другая крайность, она ни чем не лучше.)

TDrive ★★★★★
()
Ответ на: комментарий от Stanson

И даже не пытаются задавать вопросы.

А ведь и правда, может быть это заговор правительства?

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Чем больше людей смогут допилить твой код под свои нужды тем больше он пригоден для допиливания под свои нужды.

У вебмакак нет и не может быть таких нужд, которые обеспечивает этот код. Поэтому как-либо утруждаться чтобы вебмакакам было удобно его допиливать нет никакого смысла.

А ведь и правда, может быть это заговор правительства?

Как минимум, производители железа имеют прямой профит от существования жирного вебговна и браузеров допускающих его работу.

А уж сговорились они, или «само получилось» я не в курсе. Наверно можно посмотреть, есть ли в спонсорах браузеров и/или вебговна производители железа или их прокладки, но мне, в общем-то пофиг.

Stanson ★★★★★
() автор топика
Последнее исправление: Stanson (всего исправлений: 1)
Ответ на: комментарий от Stanson

Как минимум, производители железа имеют прямой профит от существования жирного вебговна и браузеров допускающих его работу.

Не боишься, что производители железа найдут этот тред и увидят, что кто то пишет слишком эффективный код?

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Не боишься, что производители железа найдут этот тред и увидят, что кто то пишет слишком эффективный код?

Мне совершенно пофиг на проблемы производителей.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Мне совершенно пофиг на проблемы производителей.

Ты снижаешь их прибыль, пишешь код который работает на старом железе, думаешь они оставят это так просто?

TDrive ★★★★★
()
Ответ на: комментарий от TDrive

Не стоит свои параноидальные измышления вываливать в общественном месте, мимокрокодилы могут нетолерантное про тебя подумать.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от TDrive

Это тоже один из характерных признаков паранойи.

Stanson ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.