PDA

Visualizza la versione completa : Richiesta aiuto per creare grafico da file di testo


pilovis
11-01-2019, 21:42
Ciao a tutti,

dopo quasi un anno di assenza eccomi di nuovo qui :smack: :ciauz:
Non ho abbandonato Linux, ma mi sono dedicato ai sistemi embedded basati su Linux kernel come OpenWrt e Raspberry.

Ho bisogno di aiuto

Ho messo su un misuratore di radiazioni ionizzanti (contatore geiger) con un raspberry e un modulo dedicato per arduino.

Potete trovare maggiori dettagli nel mio forum personale dove metto tutti i miei progetti:
http://49v.com/viewtopic.php?f=47&t=227&p=518#p518

Praticamente effettuo una lettura ogni minuto e la inserisco in un file di testo che poi viene visualizzato tramite browser.

Ora dovrei generare un grafico da mettere in una pagina web con l'andamento della radiazione nel tempo.

Il file e' cosi' strutturato:

ven 11 gen 2019 20:45:23 CET: CPM=9
ven 11 gen 2019 20:45:23 CET: 0.073080 uSv/h
ven 11 gen 2019 20:46:23 CET: CPM=5
ven 11 gen 2019 20:46:24 CET: 0.040600 uSv/h
ven 11 gen 2019 20:47:24 CET: CPM=5
ven 11 gen 2019 20:47:24 CET: 0.040600 uSv/h
ven 11 gen 2019 20:48:24 CET: CPM=6
ven 11 gen 2019 20:48:24 CET: 0.048720 uSv/h
ven 11 gen 2019 20:49:24 CET: CPM=11
ven 11 gen 2019 20:49:24 CET: 0.089320 uSv/h
ven 11 gen 2019 20:50:24 CET: CPM=6
ven 11 gen 2019 20:50:24 CET: 0.048720 uSv/h
ven 11 gen 2019 20:51:24 CET: CPM=7
ven 11 gen 2019 20:51:24 CET: 0.056840 uSv/h
ven 11 gen 2019 20:52:24 CET: CPM=9
ven 11 gen 2019 20:52:24 CET: 0.073080 uSv/h
ven 11 gen 2019 20:53:24 CET: CPM=11
ven 11 gen 2019 20:53:24 CET: 0.089320 uSv/h
ven 11 gen 2019 20:54:24 CET: CPM=2
ven 11 gen 2019 20:54:24 CET: 0.016240 uSv/h
ven 11 gen 2019 20:55:24 CET: CPM=7
ven 11 gen 2019 20:55:24 CET: 0.056840 uSv/h
ven 11 gen 2019 20:56:24 CET: CPM=5
ven 11 gen 2019 20:56:24 CET: 0.040600 uSv/h
ven 11 gen 2019 20:57:24 CET: CPM=9
ven 11 gen 2019 20:57:24 CET: 0.073080 uSv/h
ven 11 gen 2019 20:58:24 CET: CPM=10
ven 11 gen 2019 20:58:24 CET: 0.081200 uSv/h
ven 11 gen 2019 20:59:24 CET: CPM=9
ven 11 gen 2019 20:59:24 CET: 0.073080 uSv/h
ven 11 gen 2019 21:00:24 CET: CPM=8
ven 11 gen 2019 21:00:24 CET: 0.064960 uSv/h

c'e' un'anima pia che puo' indicarmi come posso fare?

P.S.: gnuplot non mi fuziona perche' non ho nessun server X (headless).

pilovis
11-01-2019, 21:45
29706

pilovis
11-01-2019, 21:48
Questo e' lo script che mi spara i dati dentro la dir /var/www/rad in un file che ha il nome della data (ogni giorno cambia):


root/geiger_tube/geiger_tube 2>&1 | awk '{ print strftime("%c: "), $0; fflush(); }' | tee /var/www/rad/$( date '+%d-%m-%Y' ) &

pilovis
12-01-2019, 21:41
Qualcosa sono riuscito a fare, non mi soddisfa ancora ma e' un inizio :smack:,
innanzitutto ho importato i dati dal file CSV in un DB MySQL, poi ho usato python, pandas e ploty

https://plot.ly/~pilovis/6/utext-uusvh-vs-utext-uunix-time/#/

nell'asse delle X c'e' il Unix_time, in quello delle Y c'e' il valore di radiazione in microSievert/ora, l'intervallo di misura e' di un minuto, il grafico si riferisce ad oggi, i dati sono reali.

pilovis
12-01-2019, 21:47
Qui ho riportato tutta la storia fino a questo punto, con codici e spiegazioni:
http://49v.com/viewtopic.php?f=47&t=227 (http://49v.com/viewtopic.php?f=47&t=227)

pilovis
12-01-2019, 21:57
Giusto per completezza di informazione ecco il codice che ho creato in una notte insonne :confused: per importare i dati dal file csv in MySQL e il codice per inviare i dati da MySQL al programma di plottaggio:

esportare i dati nel file csv
print_rad2csv.sh
codice:
#!/bin/bash
/root/geiger_tube/measure 2>&1 | awk '{ print strftime("%s %Y-%m-%d %H:%M:%S"), $0; fflush(); }' | sed -e 's/\s\+/,/g;w /var/www/rad/readings.csv' &

nota: l'output generato e' cosi' strutturato:
[unix-time,date,time,value,unit of measure]
1547278704,2019-01-12,08:38:24,0.024360,uSv/h
il unix_time mi serve come chiave univoca nel DB per evitare di importare doppioni

importare i dati dal file csv in MySQL
import_csv2sql.sh
codice:
#!/bin/bash
/usr/bin/mysql -upilovis -pSECRET --local_infile=1 data -e "LOAD DATA LOCAL INFILE '/var/www/rad/readings.csv' INTO TABLE letture_radiazioni FIELDS TERMINATED BY ',' enclosed by '\"


inviare i dati al programma di plottaggio web
plot_graph.py

import MySQLdb
conn = MySQLdb.connect(host="localhost", user="pilovis", passwd="SECRET", db="data")
cursor = conn.cursor()
cursor.execute('select unix_time, date, time, value, unit from letture_radiazioni');
rows = cursor.fetchall()
import pandas as pd
df = pd.DataFrame( [[ij for ij in i] for i in rows] )
df.rename(columns={0: 'unix_time', 1: 'date', 2: 'time', 3: 'value', 4: 'unit'}, inplace=True);
df = df.sort(['value'], ascending=[1]);
import plotly.plotly as py
from plotly.graph_objs import *
py.sign_in('pilovis', 'SECRET')
unit = df['unit']

trace1 = Scatter(
x=df['unix_time'],
y=df['value'],
text=unit,
mode='markers'
)
layout = Layout(
xaxis=XAxis( type= 'linear', title='unix_time' ),
yaxis=YAxis( type= 'linear', title='uSv/h' )
)
data = Data([trace1])

fig = Figure(data=data, layout=layout)
py.iplot(fig, filename='radiation')

pilovis
16-01-2019, 04:35
Per il momento ho abbandonato l'idea di creare un grafico in tempo reale, troppo casino per avere qualcosa che sia free :cry:

Ho comunque creato una pagina web che mostra le misure di radiazione Gamma e permette anche di vedere il file csv giornaliero con le ultime misure effettuate oltre alla possibilita' di scaricare il dump completo del database (mysql) con lo storico di tutte le misurazioni.

qui c'e la pagina web aggiornata in tempo reale: http://ditta.com:887/
(http://ditta.com:887/)
ho messo online anche un'altra pagina web che mostra invece i valori di unidita', temperatura e pressione atmosferica: http://vinchio.ditta.com:888/



(http://ditta.com:887/)

pilovis
16-01-2019, 23:29
Scusate, questo e' il link giusto:

http://vinchio.org

Vincent.Zeno
16-01-2019, 23:40
dopo tutti questi post solitari... scrivo per ringraziarti della tua condivisione. :)

non volevo farti sentire solo :D

marino51
17-01-2019, 09:28
puoi cercare nel link
https://www.highcharts.com/demo

vi sono molti esempi tra cui un paio "live", ogni esempio fornito di codice
il codice privo di costi per "uso personale"

lo sto usando dal 2011 ed particolarmente valido

ho creato una base js (qualcosa come un'interfaccia) che riceve i dati da php e visualizza il grafico
ogni script php raccoglie i dati necessari per lo specifico grafico e richiama il js

per farmi capire, ti posto alcune righe di js che ricevono i valori da php

$(document).ready(function()
{
var SPW_Chart = '<?php echo ( empty($SPW_Chart) ? '' : $SPW_Chart ); ?>',
SPW_Title = '<?php echo ( empty($SPW_Title) ? 'Title' : $SPW_Title ); ?>',
var SPW_xAxis = <?php echo json_encode($SPW_xAxis); ?>;
var SPW_yAxis = <?php echo json_encode($SPW_yAxis); ?>;
var SPW_ySeries = <?php echo json_encode($SPW_ySeries); ?>;

Loading