create views and use them to plot more than one pn on same graph
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 7 Mar 2022 17:48:50 +0000 (18:48 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 7 Mar 2022 17:48:50 +0000 (18:48 +0100)
gnuplot/sub.sql [new file with mode: 0644]
views.pl [new file with mode: 0755]
www/cgi-bin/sub.cgi [new file with mode: 0755]

diff --git a/gnuplot/sub.sql b/gnuplot/sub.sql
new file mode 100644 (file)
index 0000000..039b7e8
--- /dev/null
@@ -0,0 +1,4 @@
+select to_char(time, 'YYYY-MM-DD HH24:MI:SS'), x_axis_angle, y_axis_angle, sensor_temperature, power_source_voltage
+from sub_2OI_0000137
+order by time asc 
+
diff --git a/views.pl b/views.pl
new file mode 100755 (executable)
index 0000000..8c7bb41
--- /dev/null
+++ b/views.pl
@@ -0,0 +1,105 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use autodie;
+use Data::Dump qw(dump);
+
+my $filter = join(' ',@ARGV);
+
+my $offsets;
+
+open(my $o, '<', 'gnuplot/offset.txt');
+while(<$o>) {
+       chomp;
+       my ( $pn, $o_x, $o_y ) = split(/ /,$_);
+       $offsets->{$pn} = [ $o_x, $o_y ];
+}
+close($o);
+
+my $time_limit;
+
+open(my $o, '<', 'gnuplot/time.txt');
+while(<$o>) {
+       chomp;
+       my ( $pn, $time ) = split(/ /,$_, 2);
+       $time_limit->{$pn} = $time;
+}
+close($o);
+
+my $sql;
+my $view2number;
+
+open(my $n, '<', 'subvision-numbers.txt');
+while(<$n>) {
+       chomp;
+       my ( $number, $pn, $imei, $name ) = split(/ /,$_);
+
+       if ( $filter && $name !~ m/$filter/i ) {
+               warn "SKIP $number $pn\n";
+               next;
+       }
+
+       my $view = 'sub_' . $number;
+       $view =~ s/\W+/_/g;
+
+       $view2number->{$view} = $number;
+
+       my $offset_x = $offsets->{$pn}->[0] // 0;
+       my $offset_y = $offsets->{$pn}->[1] // 0;
+
+       my $time = $time_limit->{$pn} // '';
+
+       if ( ! defined( $sql->{$view} ) ) {
+               $sql->{$view} = qq{
+create or replace view $view as
+select time, pn, x_axis_angle + $offset_x as x_axis_angle, y_axis_angle + $offset_y as y_axis_angle, power_source_voltage, sensor_temperature, signal_strength
+from zc
+where pn = $pn $time
+};
+       } else {
+               $sql->{$view} .= qq{
+union
+select time, pn, x_axis_angle + $offset_x as x_axis_angle, y_axis_angle + $offset_y as y_axis_angle, power_source_voltage, sensor_temperature, signal_strength
+from zc
+where pn = $pn $time
+};
+       }
+
+}
+close($n);
+
+open(my $sql_fh, '>', "/tmp/$filter.sql");
+open(my $shell_fh, '>', "/tmp/$filter.sh");
+open(my $html_fh, '>', "/tmp/$filter.html");
+
+print $html_fh qq{<html>
+<head>
+       <meta charset=utf-8 />
+       <title>$filter</title>
+</head>
+<body>
+
+       <p>
+       <img src=logo-color.png>
+
+};
+
+foreach my $view ( sort keys %$sql ) {
+       print $sql_fh "drop view $view ;\n";
+       print $sql_fh $sql->{$view} . ";\n";
+       print $sql_fh "grant select on $view to grafana ;\n\n";
+
+       print $shell_fh "ln -s sub.cgi $view.cgi\n";
+
+       print $html_fh qq{
+       <h1>$view2number->{$view}</h1>
+       <img src="cgi-bin/$view.cgi" width="100%">
+};
+}
+
+print $html_fh qq{
+       </p>
+
+</body>
+};
+
diff --git a/www/cgi-bin/sub.cgi b/www/cgi-bin/sub.cgi
new file mode 100755 (executable)
index 0000000..ea245cb
--- /dev/null
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+dir=/home/dpavlin/zc/gnuplot/
+
+echo "Content-type: image/svg+xml"
+echo
+
+name=$( basename $0 | sed 's/.cgi//' )
+
+test -z "$QUERY_STRING" && QUERY_STRING='.'
+gnuplot_sed='';
+
+yrange=$( echo $QUERY_STRING | grep '^yrange=[0-9]*\.[0-9]*$' | cut -d= -f2 )
+test -z "$yrange" && yrange=0.2
+
+voltage=0
+echo $HTTP_REFERER | grep -q voltage && voltage=1
+echo $QUERY_STRING | grep -q voltage && voltage=1
+
+cat $dir/sub.sql | sed -e "s/from sub_[^ ]*/from $name/" | psql --username=dpavlin -A -F "," -t zc > /dev/shm/$name.txt
+if [ -s /dev/shm/$name.txt ] ; then
+cat $dir/template.gnuplot | sed -e "s,axes.txt,/dev/shm/$name.txt," -e "s,^set terminal.*$,set terminal svg," -e "s,^set output.*$,set output," -e "s,-0.3 : 0.3,-$yrange : $yrange," -e "s,< 0.3,< $yrange," > /dev/shm/$name.gnuplot
+gnuplot -e "voltage=$voltage" /dev/shm/$name.gnuplot
+else
+cat << __SVG__
+<?xml version="1.0" encoding="utf-8"  standalone="no"?>
+<svg 
+ width="600" height="1"
+ viewBox="0 0 600 480"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+>
+</svg>
+__SVG__
+fi
+
+#rm /dev/shm/axes.txt.$$ /dev/shm/axes.gnuplot.$$