Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:controllers:youless

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:

<?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

  • $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 …

how to flash a complete volkszahler image on your raspberry

hardware/controllers/youless.txt · Zuletzt geändert: 2017/06/08 09:28 von tiedi