Youless device
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:
Connection to volkszaehler
Data format
Information on how to access the device: http://wiki.td-er.nl/index.php?title=YouLess
Example
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.
PHP-Code for posting to middleware
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:
- php file: vzapihelper.php
- php file: yl.php
- sh file: yl.sh (the only file you have to enter individual code. UUIDs of your VZ-Channels an the IP adress of your youless device)
creating the 3 used files
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:
- yl.php
<?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:
- vzapihelper.php
<?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:
- yl.sh
#!/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
- $url - the url to read the youless from
- $vzurl - the url your middleware runs at
- $cuuid_pwr - the channel id to post the power reading in Watt to
- $cuuid_cnt - the channel id to post the power reading in Wh to (resolution 1000)
- $delay - how long to wait between posts default: 5 secs / 12 readings per minute
- $cnt_modulo - how often to send the kwH reading default: on every 12th reading / once per minute
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 …