Benutzer-Werkzeuge

Webseiten-Werkzeuge


hardware:controllers:youless

Dies ist eine alte Version des Dokuments!


You less device

Postfossil BV from the Netherlands:

offers a meter reading device at:

In germany the device is available via:

and can be ordered via Amazon at

although the device is offered much cheaper via the vendor in the netherlands. The device has a lan interface and can be used with analog ferraris meters as well as digital S0 input.

manual

You less software

This is a screen shot of the web interface offered:

Connection to volkszaehler

I (Wolfgang - wf (at) bitplan.com) am currently trying it out and intending to connect it to the volkszaehler solution. I'll post any news here.

data format

has information on how to access the device

example

In my environment the youless device has the ip address 2.0.0.94.

Using the url http://2.0.0.94/a?f=j

the json response is:

{"cnt":"22018,290","pwr":3789,"lvl":0,"dev":"","det":"","con":"*","sts":"","raw":1}

The json encode 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 middlware. As of version 1.14 it's working in my (Wolfgang's) environment.

There are three files used:

  • php file: vzapihelper.php
  • php file: yl.php
  • shell script yl

the yl script is to be used for testing or to be called regularly from a crontab entry - it needs to be configured while the yl.php and vzapihelper.php files should work generaly as of the state of Volkszähler software in May 2014.

You might want to set:

  • $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 use the code copy the two script parts to a „vzapihelper.php“ and „yl.php“ and then start with e.g.

loop call
php yl.php \
  --url="http://2.0.0.94/a?f=j" \
  --vzurl="http://capri/vz/middleware.php/data" \
  --cuuid_pwr="0cca0870-e695-11e3-8c38-xxxx" \
  --cuuid_cnt="b8192a00-e71e-11e3-be31xxxx" \
  --delay=5 \
  --cnt_modulo=12 \
  --loop
call from cron
cd /home/wf/youless
php yl.php \
  --url="http://2.0.0.94/a?f=j" \
  --vzurl="http://capri/vz/middleware.php/data" \
  --cuuid_pwr="0cca0870-e695-11e3-8c38-xxxx" \
  --cuuid_cnt="b8192a00-e71e-11e3-be31-xxxx" >> /var/log/energymeter.log

the output should look like:

2014-05-28 21:05:07   1,518 kWh 1304 Watt
2014-05-28 21:05:12   1,520 kWh 1338 Watt
2014-05-28 21:05:17   1,522 kWh 1318 Watt

For any feedback please contact me at wf (at) bitplan.com. Enjoy …

<?php
  /**
   * read meter data from youless device
   * and post it to volkszaehler
   * $Header: /home/wf/youless/RCS/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++;
  }
 
?>
vzapihelper

helper functions to talk to middleware and evaluate command line options

<?php
  /**
   * vzapi helper functions
   * $Header: /home/wf/youless/RCS/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");
  }
 
?>
hardware/controllers/youless.1493449383.txt.gz · Zuletzt geändert: 2017/04/29 09:03 von wf_bitplan.com