Deletando na marra um valor de dataPoint do banco

Certas vezes voce necessita remover ou substituir um valor num datapoint, contudo, para remover valores dos datapoints voce tem apenas a opcao de remover valores extremos.

vejamos o caso abaixo:

image

na imagem acima, temos valores de temperatura lidos de um sensor DS18S20 e quando o sensor tem problema de leitura, o sensor costuma responder com o valor 0.06. No nosso caso acima, isso foi o que ocorreu. Contudo, temos as vezes que monitorar baixas temperaturas como em camara fria que pode ficar abaixo de zero. o que ocorre com isso é que voce é obrigado a remover somente o valor citado 0.06. No meu caso é temperatura ambiente e no Brasil, pelo menos no sudeste, é muito complicado aparecer temperaturas proximas a zero. olhe o grafico como ficou estranho com esses valores invalidos:

Contudo, há uma solucao via SQL.

Entre no seu gerenciador de banco de dados onde fica o banco de dados do Scada, no meu caso, estou usando MariaDB e costumo logar diretamente no banco de dados, senao apos logar, a instrucao use dbScadaBR (ou o nome do banco de dados) resolve.

vejamos:


mysql -u usuarioadmin -pSenhaMuitoLongaEsecreta -D dbScadaBR -h servidorMariadb.dominio.com.br 

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 34889
Server version: 10.6.18-MariaDB-log managed by servidorMariadb.dominio.com.br 

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Logamos, agora vamos mostrar a estrutura da tabela onde ficam os dados dos datapoints…

MariaDB [dbScadaBR]> describe pointValues;
+-------------+------------+------+-----+---------+----------------+
| Field       | Type       | Null | Key | Default | Extra          |
+-------------+------------+------+-----+---------+----------------+
| id          | bigint(20) | NO   | PRI | NULL    | auto_increment |
| dataPointId | int(11)    | NO   | MUL | NULL    |                |
| dataType    | int(11)    | NO   |     | NULL    |                |
| pointValue  | double     | YES  |     | NULL    |                |
| ts          | bigint(20) | NO   | MUL | NULL    |                |
+-------------+------------+------+-----+---------+----------------+
5 rows in set (0.001 sec)

dataPointId é o ID do datapoint, voce ve isso nas propriedades do datapoint
http scadabr.machine/ScadaBR/data_point_details.shtm?dpid=111

O campo pointValue contem o valor do datapoint, dataType o tipo do valor,
ts o valor de diaMesAnoHoraMinutoSegundoMilisegundo da ocorrencia. nada mais eh que o Unixtimestamp mais os milisegundos. que representa o numero de segundos desde 1 de janeiro de 1970 mais os milesimos de segundo.

antes da instrucao para deletar os valores, vamos conferir via comando select se vamos pegar somente os dados corretos e nao fazer algo errado depois:

MariaDB [dbScadaBR]> select pointValue, dataPointId, dataType from pointValues where pointValue = 0.06;
+------------+-------------+----------+
| pointValue | dataPointId | dataType |
+------------+-------------+----------+
|       0.06 |          65 |        3 |
|       0.06 |          65 |        3 |
|       0.06 |          63 |        3 |
|       0.06 |          64 |        3 |
|       0.06 |          62 |        3 |
|       0.06 |          64 |        3 |
|       0.06 |          63 |        3 |
|       0.06 |          64 |        3 |
|       0.06 |          63 |        3 |
|       0.06 |          64 |        3 |
|       0.06 |          63 |        3 |
+------------+-------------+----------+
11 rows in set (0.234 sec)

MariaDB [dbScadaBR]> delete from pointValues where pointValue = 0.06;
Query OK, 11 rows affected (0.583 sec)

Sim, selecionamos todos os valores invalidos. agora vamos mudar a instrucao para delete com a mesma clausula where, para dizer ao banco de dados que devemos apagar os valores sob esta condicao.

CUIDADO

Seja bem criterioso ao fazer isso. Consulte seu admin de banco de dados em caso de duvidas antes desta instrucao.


MariaDB [dbScadaBR]> delete from pointValues where pointValue = 0.06;
Query OK, 11 rows affected (0.583 sec)

veja que a query apagou os mesmos 11 registros mostrados pelo select anterior. vamos conferir se apagaram?


MariaDB [dbScadaBR]> select pointValue, dataPointId, dataType from pointValues where pointValue = 0.06;
Empty set (0.250 sec)

Maravilha, agora os dados invalidos foram removidos

Se o dado nao for numerico, o valor no campo pointValue sera sempre 0.00 e seu valor estara guardado na tabela pointValueAnnotations:

describe pointValueAnnotations;
+---------------------+--------------+------+-----+---------+-------+
| Field               | Type         | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+-------+
| pointValueId        | bigint(20)   | NO   | MUL | NULL    |       |
| textPointValueShort | varchar(128) | YES  |     | NULL    |       |
| textPointValueLong  | longtext     | YES  |     | NULL    |       |
| sourceType          | smallint(6)  | YES  |     | NULL    |       |
| sourceId            | int(11)      | YES  |     | NULL    |       |
+---------------------+--------------+------+-----+---------+-------+
5 rows in set (0.001 sec)

Os valores ficam ou no campo textPointValueShort ou no campo textPointValueLong dependendo do tamanho do texto contido no campo.