Postfossil BV from the Netherlands: http://www.postfossil.nl/
offers a meter reading device at: http://www.youless.net/home.html
In germany the device is available via: http://www.bg-etech.de/
English manual can be found at: http://www.bg-etech.de/images/YouLess/Youless-manual-1.3C_EN.pdf
The device has a lan interface and can be used with analog ferraris meters as well as digital S0 input.
This is a screen shot of the web interface offered:
Information on how to access the device: http://wiki.td-er.nl/index.php?title=YouLess
In my environment the youless device has the ip address 192.168.0.12 Using the url http://192.168.0.12/a?f=j the json response is:
{"cnt":"22018,290","pwr":3789,"lvl":0,"dev":"","det":"","con":"*","sts":"","raw":1}
The json encoded information has the current meter count / kWh in „cnt“ and the current power level in Watts in „pwr“. This information needs to be converted to volkszaehler format and posted to the middleware - this is what the code below does.
The following code is an attempt to read data from the youless logger and post it to the volkszaehler middleware. As of version (2017/06 June) it's working in my environment.
There are three files used:
to edit or create a file type the following in your console of your volkszaehler raspberry or what else:
sudo nano /etc/yl.php
the file „yl.php“ in the folder „etc“ doesn't exist before, so you now have created. Insert the following code and press „STRG“ +„X“ to save an exit the file:
<?php /** * read meter data from youless device * and post it to volkszaehler * $Header: /etc/yl.php,v 1.14 2014/06/01 10:40:37 wf Exp wf $ */ // common code for reading and posting require __DIR__.'/vzapihelper.php'; /** * read the meter */ function readyouless($url) { $json=readUrl($url); // get the meter reading $meter=json_decode($json, true); // Will dump a beauty json :3 // comment out next line if you'd like to debug the json message // var_dump($meter); return $meter; } /** * transfer youless reading to vz middleware * param 1: url to read from youless * param 2: vzurl - middleware url of volkszaehler * param 3: channel uuid for power reading in Watt * param 4: channel uuid for energy reading in kWh * param 5: shall we post the cnt reading? */ function youless2vz($url,$vzurl,$cuuid_pwr,$cuuid_cnt,$post_cnt) { // read data from youless $meter=readyouless($url); // get values $pwr=$meter["pwr"]; $cnt=$meter["cnt"]; // the level is not interesting for digital meters // if you have an analog meter you might want to use and show this // $lvl=$meter["lvl"]; // convert to php compatible value $cnt=str_replace(",",".",$cnt); // calculate Wh from kWh $cnt1000=$cnt*1000.0; // get human readable time stamp $now=date("Y-m-d H:i:s"); // display progress (comment if you use this in cron job) printf("%s YL: % 5d Watt % 10.3f kwH\n",$now,$pwr,$cnt); // post data to middleware according to: // http://wiki.volkszaehler.org/development/api/reference # first post the power reading in Watt post2vz($vzurl,$cuuid_pwr,$pwr); # then the energy reading in Wh if ($post_cnt) { post2vz($vzurl,$cuuid_cnt,$cnt1000); } } $loop=0; // possible command line options // --loop --url= --vzurl= --cuuid_pwr= --cuuid_cnt= --delay= --cnt_modulo= $longopts=array("loop","url:","vzurl:","cuuid_pwr:","cuuid_cnt:","delay:","cnt_modulo:"); $shortopts=""; $options=getopt($shortopts,$longopts); // the url to read the youless device from (json option) $url=checkoption("url",$options); // the volkszaehler middleware url $vzurl=checkoption("vzurl",$options); // channel uuids // power (watts) $cuuid_pwr=checkoption("cuuid_pwr",$options); // energy (kWh) $cuuid_cnt=checkoption("cuuid_cnt",$options); // loop option - if no set just one shot (e.g. in cron) $doloop=array_key_exists("loop",$options); if ($doloop) { // how often to post to middleware // delay in seconds between posts $delay=intval(checkoption("delay",$options)); // how many delays for posting a kwH reading $cnt_modulo=intval(checkoption("cnt_modulo",$options)); $maxloop=2147483647; // MAXINT } else { $maxloop=1; $cnt_modulo=1; } // run once or in a loop while ($loop<$maxloop) { youless2vz($url,$vzurl,$cuuid_pwr,$cuuid_cnt,$loop % $cnt_modulo==0); if ($doloop) { sleep($delay); } $loop++; } ?>
now do the same for the second file, the vzapihelper.php. Type the following in your console:
sudo nano /etc/vzapihelper.php
Insert the following code and press „STRG“ +„X“ to save an exit the file:
<?php /** * vzapi helper functions * $Header: /etc/vzapihelper.php,v 1.3 2014/05/30 06:57:23 wf Exp $ */ /** * get a curl channel */ function curl($url) { // Initiate curl $ch = curl_init(); // Disable SSL verification curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Will return the response, if false it print the response curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Set the url curl_setopt($ch, CURLOPT_URL,$url); return $ch; } /** * read the given url * @param $url:the url to read from */ function readUrl($url) { $ch=curl($url); // Execute $result=curl_exec($ch); return $result; } /** * post to the given url */ function postUrl($url,$fields) { $ch=curl($url); $fields_string=""; //url-ify the data for the POST foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; } rtrim($fields_string, '&'); curl_setopt($ch,CURLOPT_POST, count($fields)); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string); $result=curl_exec($ch); return $result; } /** * post data to vz middleware * param 1: vzurl - middleware url of volkszaehler * param 2: channel uuid * param 3: value to post */ function post2vz($vzurl,$cuuid,$value,$debug=false) { // post data to middleware according to: // http://wiki.volkszaehler.org/development/api/reference // adapt timestamp to volkszaehler conventions $timestamp=time()*1000; # first $posturl=$vzurl."/".$cuuid.".json"; $fields=array("ts"=>$timestamp,"value" => $value ); $presult=postUrl($posturl,$fields); if ($debug) { echo $presult; } } /** * check that option $opt is available in $options * return the value if available */ function checkoption($opt,$options) { if (array_key_exists($opt,$options)) return $options[$opt]; else die("option $opt missing!\n"); } ?>
The last file ist the yl.sh. The script automatically will be started from the crontab (Taskmgr) of your linux system, so that the youless device is also working after a reboot.
Type the following in your console:
sudo nano /etc/yl.sh
Insert the following code and press „STRG“ +„X“ to save an exit the file:
#!/bin/bash while true do php /etc/yl.php \ --url="http://IP ADRESS OF YOUR YOULESS DEVICE/a?f=j" \ --vzurl="http://localhost/middleware.php/data" \ --cuuid_pwr="ENTER HERE THE UUID OF THE CHANNEL FORM YOUR VOLKSZAEHLER YOU WANT TO POST THE CURRENT POWER TO" \ --cuuid_cnt="ENTER HERE THE UUID OF THE CHANNEL FORM YOUR VOLKSZAEHLER YOU WANT TO POST THE METER READING (Zählerstand) TO" \ --delay=15 \ --cnt_modulo=12 \ --loop done exit 0
Here is a statement of the parameter
To make the sh-file executable for crontab (Taskmgr) you have to give the rights. Type the following into your console:
sudo chmod +x /etc/yl.sh
To edit the crontab type
sudo nano /etc/rc.local
and add the following line on the bottom of the file, before the line „exit 0“:
bash /etc/yl.sh&
So that's it. now it should work.
You also can test your configuration if you enter the following code in your console:
php /etc/yl.php \ --url="http://IP ADRESS OF YOUR YOULESS DEVICE/a?f=j" \ --vzurl="http://localhost/middleware.php/data" \ --cuuid_pwr="ENTER HERE THE UUID OF THE CHANNEL FORM YOUR VOLKSZAEHLER YOU WANT TO POST THE CURRENT POWER TO" \ --cuuid_cnt="ENTER HERE THE UUID OF THE CHANNEL FORM YOUR VOLKSZAEHLER YOU WANT TO POST THE METER READING (Zählerstand) TO" \ --delay=15 \ --cnt_modulo=12 \ --loop done exit 0
the output should look like:
2017-04-29 10:59:00 YL: 640 Watt 50.595 kwH 2017-04-29 10:59:05 YL: 639 Watt 50.596 kwH 2017-04-29 10:59:10 YL: 639 Watt 50.597 kwH
For any feedback please contact wf (at) bitplan.com or tiedi (at) web.de. Enjoy …