add command line to print charts

This commit is contained in:
Simon Vieille 2021-01-17 18:03:18 +01:00
parent 7c1e4a0c7d
commit 8d8d2afe93
Signed by: deblan
GPG key ID: 03383D15A1D31745
6 changed files with 210 additions and 5 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "lib/eplot"]
path = lib/eplot
url = https://github.com/chriswolfvision/eplot

1
lib/eplot Submodule

@ -0,0 +1 @@
Subproject commit aa4d607f050284c803583ba78852c845f749d67d

View file

@ -1,6 +1,7 @@
{
"dependencies": {
"bootstrap": "^4.4.1",
"chart.js": "^2.9.3"
"chart.js": "^2.9.3",
"ervy": "^1.0.7"
}
}

View file

@ -0,0 +1,92 @@
<?php
namespace App\Command;
use App\Repository\HygrometryRepository;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Process\Process;
class ChartHygrometryCommand extends ContainerAwareCommand
{
protected static $defaultName = 'app:chart:hygrometry';
protected HygrometryRepository $repository;
protected KernelInterface $kernel;
protected ParameterBagInterface $params;
public function __construct(HygrometryRepository $repository, KernelInterface $kernel, ParameterBagInterface $params)
{
$this->repository = $repository;
$this->kernel = $kernel;
$this->params = $params;
parent::__construct();
}
protected function configure()
{
$this
->setDescription('Show a chart of hygrometry')
;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
chdir($this->getContainer()->get('kernel')->getProjectDir());
$entities = $this->repository->findByDateRange(
new \DateTime('now - 1 day'),
new \DateTime('now'),
42,
'DESC'
);
$entities = array_reverse($entities);
$table = new Table($output);
$table->setHeaders(['ID', 'Date', 'Value']);
$max = (int) $this->params->get('hygrometry_trigger_max');
$stats = ['Value,Max'];
foreach ($entities as $i => $entity) {
$stats1[] = $entity->getvalue();
$stats2[] = $max;
$table->addRow([
$i,
$entity->getDate()->format('d/m/Y H:i'),
$entity->getValue().'%',
]);
}
$filename1 = tempnam('./', self::$defaultName);
$filename2 = tempnam('./', self::$defaultName);
file_put_contents($filename1, implode("\n", $stats1));
file_put_contents($filename2, implode("\n", $stats2));
$process = new Process([
'./lib/eplot/eplot',
'-d',
'-t',
'Max@Hygrometry',
'-m',
$filename2,
$filename1,
]);
$process->run();
$output->writeln($process->getOutput());
$table->render();
unlink($filename1);
unlink($filename2);
return 0;
}
}

View file

@ -0,0 +1,103 @@
<?php
namespace App\Command;
use App\Repository\TemperatureRepository;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Helper\Table;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Process\Process;
class ChartTemperatureCommand extends ContainerAwareCommand
{
protected static $defaultName = 'app:chart:temperature';
protected TemperatureRepository $repository;
protected KernelInterface $kernel;
protected ParameterBagInterface $params;
public function __construct(TemperatureRepository $repository, KernelInterface $kernel, ParameterBagInterface $params)
{
$this->repository = $repository;
$this->kernel = $kernel;
$this->params = $params;
parent::__construct();
}
protected function configure()
{
$this
->setDescription('Show a chart of temperature')
;
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
chdir($this->getContainer()->get('kernel')->getProjectDir());
$entities = $this->repository->findByDateRange(
new \DateTime('now - 1 day'),
new \DateTime('now'),
42,
'DESC'
);
$entities = array_reverse($entities);
$table = new Table($output);
$table->setHeaders(['ID', 'Date', 'Value']);
$perfect = (int) $this->params->get('temperature_trigger_max');
$min = (int) $this->params->get('temperature_trigger_min');
$stats = ['Value,Perfect,Min'];
foreach ($entities as $i => $entity) {
$stats1[] = $entity->getvalue();
$stats2[] = (float) 27;
$stats3[] = (float) $min;
$table->addRow([
$i,
$entity->getDate()->format('d/m/Y H:i'),
$entity->getValue().'°',
]);
}
$filename1 = tempnam('./', self::$defaultName);
$filename2 = tempnam('./', self::$defaultName);
$filename3 = tempnam('./', self::$defaultName);
file_put_contents($filename1, implode("\n", $stats1));
file_put_contents($filename2, implode("\n", $stats2));
file_put_contents($filename3, implode("\n", $stats3));
$process = new Process([
'./lib/eplot/eplot',
'-d',
'-r',
'[0:45][10:35]',
'-t',
'Perfect@Min@Temperature',
'-m',
basename($filename2),
basename($filename3),
basename($filename1),
]);
$process->run();
$graph = $process->getOutput();
$output->writeln($graph);
$table->render();
unlink($filename1);
unlink($filename2);
unlink($filename3);
return 0;
}
}

View file

@ -2,10 +2,10 @@
# yarn lockfile v1
bulma@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.8.0.tgz#ac1606431703a4761b18a4a2d5cc1fa864a2aece"
integrity sha512-nhf3rGyiZh/VM7FrSJ/5KeLlfaFkXz0nYcXriynfPH4vVpnxnqyEwaNGdNCVzHyyCA3cHgkQAMpdF/SFbFGZfA==
bootstrap@^4.4.1:
version "4.5.3"
resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.5.3.tgz#c6a72b355aaf323920be800246a6e4ef30997fe6"
integrity sha512-o9ppKQioXGqhw8Z7mah6KdTYpNQY//tipnkxppWhPbiSWdD+1raYsnhwEZjkTHYbGee4cVQ0Rx65EhOY/HNLcQ==
chart.js@^2.9.3:
version "2.9.3"
@ -47,6 +47,11 @@ color-name@^1.0.0:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
ervy@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/ervy/-/ervy-1.0.7.tgz#b4167707ef178484c7b84d7d6e8cca727cf7f252"
integrity sha512-LyHLPwIKxCKKtTO/qBMFzwA1BD5IjpM0AA3k6CeK9hrEn4Kbayi93G9eD/Ko4suEIjerSl7YpMmaOoL0g9OCoQ==
moment@^2.10.2:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"