Riposto qui un utile script che avevo postato sul forum ufficiale di Metern.
La mia configurazione di rete (sia elettrica che di rete internet) mi ha impedito di poter gestire sia l'inverter (situato in cantina) che il contatore principale (situato all'ingresso dell'appartamento) con il medesimo raspberry, senza far passare cavi di controllo nei corrugati dell'impianto.
La soluzione più semplice è stata installare 2 differenti raspberry, uno vicino l'inverter e l'altro nei pressi della scatola dei magnetotermici.
Essendo 123solar e meterN studiati per lavorare insieme o dovuto elaborare uno script di un virtualmeter per meterN per poter interrogare 123solar e gestire la visualizzazione dei dati.
Lo script va modificato nei parametri $invtnum, $pathto123s, $METERID, $INVTmetnum
Una volta modificato lo script, poi, va creato, come di consueto, il link simbolico allo stesso nella cartella /usr/bin e va effettuata la configurazione del meter nelle pagine di amministrazione.
Codice: Seleziona tutto
#!/usr/bin/php
<?php
if (isset($_SERVER['REMOTE_ADDR']))
{
die('Direct access not permitted');
}
// This script will output a 123solar counter into a meterN compatible format
// You'll need to setup the path to 123, your inverter number and your meter id
// Then ln -s /srv/http/metern/comapps/123solar.php /usr/bin/123solar
// Request Main command with '123solar energy' and live command '123solar power'
// 123solar config
$invtnum = 1;
$pathto123s = 'http://hostname/123solar/programs/programlive.php?invtnum='.$invtnum;
// meterN config
$METERID = 'solar';
$INVTmetnum = 1; // meter number
//
// Do not make changes beyond this line
//
// Global variables
$KWHT_tot = 0;
$GP = 0;
// No edit is needed below
if (isset($argv[1]))
{
if ($argv[1] == 'power')
{
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $pathto123s);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//decode the JSON into an array if hte second param is set to true otherwise the JSON will be decoded into an object
$arrayDecodedFromJSON = json_decode(curl_exec($ch), true);
// close curl resource to free up system resources
curl_close($ch);
$GP = $arrayDecodedFromJSON['G1P'] + $arrayDecodedFromJSON['G2P'] + $arrayDecodedFromJSON['G3P'];
if ($GP > 1000)
{
$GP = round($GP, 0);
}
else
{
$GP = round($GP, 1);
}
}
elseif ($argv[1] == 'energy')
{
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $pathto123s);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//decode the JSON into an array if hte second param is set to true otherwise the JSON will be decoded into an object
$arrayDecodedFromJSON = json_decode(curl_exec($ch), true);
// close curl resource to free up system resources
curl_close($ch);
$awdate = $arrayDecodedFromJSON['awdate']; //test if inverter is up or not
if ($awdate == "--:--")
{
$KWHT_tot = 0; // Inverter is off
}
else
{
$KWHT_tot = round(($arrayDecodedFromJSON['KWHT'] * 1000), 0); //in Wh
}
}
if ($argv[1] == 'energy' && $KWHT_tot == 0)
{ // 123s ain't running at night retrieve the value in meterN csv
$dir = '../data/csv/';
$output = array();
$output = glob($dir . '*.csv');
sort($output);
$cnt = count($output);
if ($cnt > 0)
{
$lines = file($output[$cnt - 1]);
$contalines = count($lines);
$KWHT_tot = null;
$j = 0;
while (!isset($KWHT_tot))
{
$j++;
$array = preg_split('/,/', $lines[$contalines - $j]);
$KWHT_tot = trim($array[$INVTmetnum]);
if ($KWHT_tot == '')
{
$KWHT_tot = null;
}
if ($j == $contalines)
{
$KWHT_tot = null; // No value found
}
}
}
else
{
die("Abording:no csv found\n");
}
}
if ($argv[1] == 'power' && $GP == 0)
{ // 123s ain't running
$GP = 0;
}
if ($argv[1] == 'power')
{
echo "$METERID($GP*W)\n";
}
elseif ($argv[1] == 'energy')
{
echo "$METERID($KWHT_tot*Wh)\n";
}
else
{
die("Abording: no valid argument given\n");
}
}
else
{
die("Usage: 123solar { power | energy }\n");
}
?>