Biblioteca FUScaBR

Olá

Criei este tópico só para avisar que a versão 2.0 da biblioteca FUScaBR (Funções Úteis para o ScadaBR) já está disponível, agora no GitHub. Além da já conhecida capacidade de alinhar elementos na Representação Gráfica, esta versão da biblioteca agora também adiciona recursos como:

  • Adição de um sistema de templates prontos nos componentes HTML e script para servidor (e a biblioteca já vem com alguns modelos!)
  • Melhorias na capacidade de criação de gráficos: agora há suporte para gráficos de data points binários.
  • Ao utilizar o componente comparação de gráficos nas Representações Gráficas, a FUScaBR irá gerar um calendário para seleção rápida de datas (graças à integração com o flatpickr)
  • Suporte a internacionalização (atualmente só há traduções para português e inglês, tradutores são bem-vindos)

Quem desejar baixar a FUScaBR, o último lançamento pode ser encontrado aqui: https://github.com/celsou/fuscabr/releases/latest/

2 curtidas

Eu achei maravilhoso.
Essa grande contribuição deve ser recompensada.
Parabens Celso pela ajuda à comunidade.

Ainda não testei mas já adorei

Bora esquentar a carcaça do tomcat aqui

Eu baixei o FUscaBR Mas eu não estou vendo as diferenças no ScadaBR teria aredito que instalei certo mas teria como mostrar as diferenças dessa biblioteca

Assim que eu tiver tempo eu vou tentar gravar um vídeo mostrando o que tem de novo na FUScaBR 2.0. Só para citar uma diferença: se tudo correu bem, tente editar uma Representação Gráfica e crie um componente script para o servidor. Você deve encontrar na janelinha de edição do script uma lista drop-down com vários “modelos” de scripts prontos. Quem gera essa lista é a FUScaBR.

FUScaBR

Eu vi lá ficou bom Muito Obrigado vou usar essa versão ai do fuscabr 2.0

Prezados, boa noite!

@Celso primeiramente gostaria de te parabenizar pela implementação da biblioteca. Realmente está sendo uma mão na roda pra apresentar os dados de maneira mais agradável aos olhos, principalmente dos clientes rs

Estou com uma dúvida, no entanto, a respeito do ajuste de um parâmetro do gráfico de linhas. Na minha aplicação, faço a leitura das tensões de um medidor de energia a cada minuto e quero apresentar esses dados no gráfico de linhas.
Primeiramente o gráfico preenchia o espaço entre a linha e o eixo X, o que pra minha aplicação é ruim. Estudando a biblioteca Charts.js e quebrando um pouco a cabeça consegui mexer no script “FUScaBR Chart (latest values)” e desabilitar essa opção fill que pintava essa área.

No entanto, aparentemente por default, o script traz a marcação dos pontos de leitura com uma bolinha. Para gráficos com intervalo de leitura mais curto não atrapalha, mas no meu caso está deixando a visualização um pouco desagradável:

Olhando na Charts.js, acredito que tenho que adicionar o elemento “options” para modificar o parâmetro “pointStyle” para conseguir o efeito desejado:

Olhando o script achei que modificando a seguinte parte conseguiria o efeito desejado, mas não deu certo:

image

Portanto, gostaria de pedir o apoio da comunidade nessa questão. É bem possível que seja uma besteira de sintaxe, mas como não sou programador experiente em javaScript to apanhando um pouco ainda :sweat_smile:

Agradeço desde já pelo apoio!

Boa tarde.

Infelizmente eu não estou com muito tempo sobrando para me dedicar à FUScaBR, então a parte de documentação da biblioteca ainda está por fazer… Mas, para tentar ajudar com o seu problema, passarei uma adaptação que provavelmente funcionará.

Primeiramente eu preciso esclarecer um pouco a estrutura da biblioteca quanto a essa parte de gráficos. O funcionamento ocorre desta forma: os scripts para servidor obtém dados do back-end sobre os data points e geram um código JSON invisível na página HTML. Esse código (que foi onde você tentou implementar a alteração) não gera o gráfico por si só. Ele apenas contém as informações necessárias para que o script do módulo de gráficos da FUScaBR (Chart) possa ler os dados e chamar o Chart.js, que faz o resto do trabalho.

Então, se queremos mudar a forma dos gráficos, temos que alterar o módulo da FUScaBR responsável por criá-los. Esse módulo está (por padrão) localizado em /resources/fuscabr/modules/minified/chart.js. Como esse é um arquivo minificado (isto é, o texto do código-fonte foi compactado para carregar mais rapidamente) eu recomendo que você primeiro edite o arquivo /resources/fuscabr/modules/chart.js, que contém exatamente o mesmo código, e depois use o código alterado para gerar um novo arquivo minificado neste site. Por fim, substitua o arquivo /resources/fuscabr/modules/minified/chart.js pelo novo arquivo minificado que você criou e limpe o cache do navegador.

Agora que eu já disse onde estão os arquivos a serem alterados, segue a alteração que deve ser feita. Você deve alterar a função createNewCharts() e adicionar a linha especificada na imagem abaixo:

Isto irá zerar o raio dos círculos de cada ponto, fazendo os mesmos desaparecerem.

Apenas algumas considerações:

  • O procedimento de remover os pontos do gráfico de linha aparentemente também desativa o pop-up que aparece ao passar o mouse sobre os pontos.
  • Se você estiver usando a versão mais antiga da FUScaBR (versão 1.0), a biblioteca inteira se resume a um único script fuscabr.js, então é esse arquivo que deve ser editado.

Espero ter ajudado. Abraços!

1 curtida

@Celso, bom dia!

Deu certo! Seguem as imagens de como ficou após os ajustes que você sugeriu.

image

image

image

Sobre a observação do radius, coloquei = 1 e manteve esse formato contínuo da linha, mas permitindo a leitura dos pontos, então fica a dica caso alguém no futuro precise.

Agradeço demais pelo apoio!

2 curtidas

Olá Rodrigo, tudo bem?

Também estou tentando desabilitar essa opção ‘fill’ dos gráficos, mas não encontrei o local que você indicou. Poderia dar um help?

Obrigado.

Boa noite. Eu lancei recentemente a FUScaBR 2.1, que traz um novo modelo de gráfico. Neste novo modelo tomei o cuidado de separar a configuração de preenchimento da do contorno. Provavelmente se você usar a versão nova e colocar a cor do preenchimento como “transparent” conseguirá o que deseja.

Github da FUScaBR:

Boa noite, Celso. Obrigado pelo retorno e parabéns pelo trabalho desenvolvido.

Abraço.

Olá Celso.

Estou realizando alguns testes com a biblioteca FUScaBR 2.1 e os resultados são muito bons. Contudo, tentei acessar o ScadaBR ( versão 1.1) através de uma Smart TV Samsumg e os gráficos ficaram invisíveis na tela da TV. O medidor (tipo gauge) também apresentou problemas (ficava com o fundo escuro na tela da TV), mas consegui solucionar modificando o parâmetro background_color do script para “transparent”. Ainda não consegui uma solução para o problema dos gráficos. Caso tenha alguma dica, agradeço.

Abraço.

Às vezes pode ser problema da implementação do navegador. Os gráficos são gerados por uma biblioteca de terceiros chamada Chart.js e usam o elemento HTML5 <canvas>. Dependendo do sistema e navegador, talvez não haja suporte adequado para o uso de <canvas> ou algum outro recurso HTML5…

boa tarde @Rodrigo_Lobo

Estou tentando editar meu gráfico para que fique igual ao seu apenas com as linhas, é sem um background color, mas estou tendo dificuldades nessa parte.

Se possível poderia compartilhar seu código do HTML do gráfico no qual compara 3 dataPoints (Va, Vb, Vc )? para que eu possa ver onde estou errando.

Oi @luan.thoele boa noite!

Desculpe a demora, estive um pouco afastado do desenvolvimento com ScadaBR nos últimos tempos, estou retomando agora e pretendo ser mais ativo no fórum!

Confesso que não me recordo bem dos ajustes que fiz nas bibliotecas que o Celso orientou, mas vou compartilhar o código, que ainda está rodando na aplicação super bem!

Colar o código abaixo em um script para o servidor, lembrando de selecionar a primeira tensão como variável do script, as outras 2 tensões são chamadas via código:

===================================
/* @license MIT */

// Points to be included in chart (ID or XID)
var reading_points = [ point.id, 465, 466];

// Color of each series in the graph
// (the position of each color corresponds
// to a point in "reading_array" variable) 
var series_colors = [ '#334662', '#658AC2', '#79A5E8' ];

// Description of each series in the graph
// (each description corresponds to a point
// in "reading_array" variable) 
var descriptions = [ 'Va', 'Vb', 'Vc' ];

// Time unit adopted in chart:
// 0 -> Seconds
// 1 -> Minutes
// 2 -> Hours
var time_unit = 2;

// Time period adopted in chart (in the unit
// specified by "time_unit" variable)
var time_value = 50;

// Customize chart size (in pixels)
var height = 350;
var width = 450;

// Configure chart title
var show_title = true;
var title = 'Medidor Geral - Tensões [V]';

// Start Y-axis always at 0
var begin_Y_at_zero = false;

// Enable chart animations
var enable_animations = true;




//
// DON'T CHANGE THE CODE BELOW
//




var invalid_message = "is not a numeric, multistate or binary datapoint";
var invalid_html = "";

// Get datapoint identifiers (ID/XID)
function getDataPointIds(identifier) {
    var dpDAO = new com.serotonin.mango.db.dao.DataPointDao();
    var dp = dpDAO.getDataPoint(identifier);

    var point_id = dp.getId();
    var point_xid = String(dp.getXid());
    return { id: point_id, xid: point_xid };
}

// Get data point type
function getDataPointType(identifier) {
	var types = {
		0: "UNKNOWN",
		1: "BINARY",
		2: "MULTISTATE",
		3: "NUMERIC",
		4: "ALPHANUMERIC",
		5: "IMAGE"
	}

	var dpDAO = new com.serotonin.mango.db.dao.DataPointDao();
    var dp = dpDAO.getDataPoint(identifier);
	var locator = dp.getPointLocator();
	return types[locator.getDataTypeId()];
}

// Get data points' values and times
function readPoints(id) {
	// Units: Second, minute, hour
	var unit_values = [ 1000, 60000, 360000];
	var index = (time_unit > 3) ? 0 : time_unit;
	var since = new Date().getTime() - (time_value * unit_values[index]);
	
	var val = new com.serotonin.mango.db.dao.PointValueDao();
	return val.getPointValues(id, since);
}

// Create a JSON array with a point value history
function createDataArray(obj, is_binary) {
	var foo = '[';
	var size = obj.size() - 1;

	for (var i = size; i >= 0; i--) {
		var time = obj.get(i).time;
		var value = obj.get(i).value;
		if (is_binary)
			value = String(value) == "true" ? 1 : 0;

		foo += '{"x":' + time + ',';
		foo += '"y":"' + value + '"}';
		
		if (i != 0) {
			foo += ',';
		}
	}
	
	foo += ']';
	return foo;
}

// Create a JSON object compatible with Chart.js "datasets"
function createJSONDatasets() {
	var size = reading_points.length;
	var foo = '[';
	
	for (var i = 0; i < size; i++) {
		var is_binary = false;
		var dp_id = getDataPointIds(reading_points[i]).id;
		var dp_type = getDataPointType(dp_id);
		var point_values = readPoints(dp_id);
		
		// Don't include non numeric datapoints in array
		if (dp_type == "BINARY") {
			is_binary = true;
		} else if (dp_type != "NUMERIC" && dp_type != "MULTISTATE") {
			invalid_html += descriptions[i] + ": " + invalid_message + "<br>";
			continue;
		}

		if (foo != '[')
			foo += ',';

		var reading_array = createDataArray(point_values, is_binary);
		foo +=	'{';
		foo +=		'"label":"' + descriptions[i] + '",';
                foo +=		'"fill": false,';
		foo +=		'"data":' + reading_array + ',';
		foo +=		'"backgroundColor":"' + series_colors[i] + '",';
		foo +=		'"borderColor":"' + series_colors[i] + '"';
		foo +=	'}';
		

	}
	
	foo += ']';
	return foo;
}

// Create a JSON string that can be interpreted
// by FUScaBR library
function createFinalJSON() {
	var foo = '';
	
	foo +=	'{';
	// Specific FUScaBR options
	foo +=		'"height":"' + height + '",';
	foo +=		'"width":"' + width + '",';
	foo +=		'"beginAtZero":' + begin_Y_at_zero + ',';
	foo +=		'"timeBased":true,';
	foo +=		'"animations":' + enable_animations + ',';
	foo +=		'"showTitle":' + show_title + ',';
	foo +=		'"title":"' + title + '",';
	// Chart.js options
	foo +=		'"type":"line",';
	foo +=		'"data":{';
	foo +=			'"datasets":' + createJSONDatasets();
	foo +=		'}';
	foo +=	'}';
	
	return foo;
}

var s = "<input class='fuscabr-chart-data' type='hidden' value='" + createFinalJSON() + "' >";
if (invalid_html.length)
	s += invalid_html;

/* Uncomment the line below to show the generated JSON code */
//s += "<div style='width: 500px;'>" + createFinalJSON() + "</div>";

return s;

===================================