##############################################
# $Id: myPoolcontroller.pm  2015-03-03  michaelvoelker
#
# zusammengebaut aus dem CodeSchnipsel von Alex
# Danke an Alex


package main;


use POSIX;
use CGI::Carp "fatalsToBrowser";
use LWP::Simple qw ($ua get);

sub myPoolcontroller_Initialize($)
{
  my ($hash) = @_;
  $hash->{DefFn}   = "myPoolcontroller_Define";
}

sub myPoolcontroller_Define($$)
{
  my ( $hash, $def ) = @_;

  my @a = split( "[ \t][ \t]*", $def );

  return "Usage: define <name> myPoolcontroller name url user password [intervall]" if(@a < 5 || @a > 6);

  my $name = $a[0];
  my $url = $a[2];
  my $user = $a[3];
  my $pass = $a[4];
  my $inter = 300;

  if(int(@a) == 5) { 
    $inter = $a[5]; 
    if ($inter < 5) {
       return "interval too small, please use something > 5, default is 300";
    }
  }

  $hash->{name} = $name;
  $hash->{url} = $url;
  $hash->{user} = $user;
  $hash->{pass} = $pass;
  $hash->{interval} = $inter;

  # initial request after 2 secs, there timer is set to interval for further update
  InternalTimer(gettimeofday()+2, "myPoolcontroller_GetUpdate", $hash, 0);

  return undef;
}

sub myPoolcontroller_GetUpdate($)
{
  my ($hash) = @_;
  my $name = $hash->{name};

  InternalTimer(gettimeofday()+$hash->{interval}, "myPoolcontroller_GetUpdate", $hash, 1);

  Log3 $name, 4, "myPool: GetUpdate called ...";

  $ua->timeout(5);
  $ua->agent('Parser - mainFile');
  $ua->credentials($hash->{url},'NeedPassword',$hash->{user}=>$hash->{pass});
 
  #### URL zur GetState.csv am Controller (http://IP-ADRESSE/GetState.csv)
  my $controllerip = "http://$hash->{url}/GetState.csv";
  my $name = $hash->{name};

  ####Controller abfragen
  my @data = get($controllerip) || return undef;
  my $data = "@data";

  ### Zeilen der GetState splitten
  ### 1. Zeile enthÃ¤lt System-Infos wie z.B. Firmwareversion, Uptime, Status der Dosierungen (AUS oder AUTO), etc...
  ### 2. Zeile enthÃ¤lt Namen der Sensoren/Aktoren
  ### 3. Zeile Einheiten der Messwerte
  ### 4. Zeile Offset um aus dem Rohmesswert einen fertigen Messwert zu berechnen
  ### 5. Zeile GAIN   um aus dem Rohmesswert einen fertigen Messwert zu berechnen
  ### 6. Zeile Rohmesswerte

  (my $sys,my $names,my $units,my $offset,my $gain,my $value) = split(/\n/,$data);
 
  ### Beispiel um alle Namen einzelnen Variablen zu zu ordnen
  (my $controllertimen,my $adc1n,my $adc2n,my $adc3n,my $adc4n,my $adc5n,my $rdxn,my $phn,my $temp1n,my $temp2n,my $temp3n,my $temp4n,my $temp5n,my $temp6n,my $temp7n,my $temp8n,my $relais1n,my $relais2n,my $rrelais3n,my $relais4n,my $relais5n,my $relais6n,my $relais7n,my $relais8n,my $di1n,my $di2n,my $di3n,my $di4n,my $rel9n,my $rel10n,my $rel11n,my $rel12n,my $rel13n,my $rel14n,my $rel15n,my $rel16n,my $clkanistern,my $phminuskanistern,my $phpluskanistern)  = split(/,/,$names);
 
  ### Beispiel um alle Einheiten einzelnen Variablen zu zu ordnen
  (my $controlelrtimeu,my $adc1u,my $adc2u,my $adc3u,my $adc4u,my $adc5u,my $rdxu,my $phu,my $temp1u,my $temp2u,my $temp3u,my $temp4u,my $temp5u,my $temp6u,my $temp7u,my $temp8u,my $relais1u,my $relais2u,my $rrelais3u,my $relais4u,my $relais5u,my $relais6u,my $relais7u,my $relais8u,my $di1u,my $di2u,my $di3u,my $di4u,my $rel9u,my $rel10u,my $rel11u,my $rel12u,my $rel13u,my $rel14u,my $rel15u,my $rel16u,my $clkanisteru,my $phminuskanisteru,my $phpluskanisteru)  = split(/\,/,$units);
 
  ### Beispiel um alle Rohwerte einzelnen Variablen zu zu ordnen
  (my $controllertimev,my $adc1v,my $adc2v,my $adc3v,my $adc4v,my $adc5v,my $rdxv,my $phv,my $t1v,my $t2v,my $t3v,my $t4v,my $t5v,my $t6v,my $t7v,my $t8v,my $r1v,my $r2v,my $r3v,my $r4v,my $r5v,my $r6v,my $r7v,my $r8v,my $di1v,my $di2v,my $di3v,my $di4v,my $r9v,my $r10v,my $r11v,my $r12v,my $r13v,my $r14v,my $r15v,my $r16v,my $clkanisterv,my $phminuskanisterv,my $phpluskanisterv) = split(/\,/,$value);
 
  ### Beispiel um aus allen Rohwerten mit Hilfe von "OffSet" und "Gain" einen fertigen Messwert zu berechnen und aus zu geben
  my @POOLnames  = split(",", $names);
  my @POOLunits  = split(",", $units);
  my @POOLvalue  = split(",", $value);
  my @POOLoffset = split(",", $offset);
  my @POOLgain   = split(",", $gain);
 
  ### Controlleruhrzeit aus den Rohdaten ermitteln
  if (($controllertimev & 0xFF) < 10) {
    my $time = ($controllertimev>>8).":0".($controllertimev & 0xFF);
  }
  else
  {
    my $time = ($controllertimev>>8).":".($controllertimev & 0xFF);
  }
 
  my $wert = 0;
  for (my $i=1;$i<$#POOLvalue+1;$i++)
  {
    ### fertigen Messwert berechnen
    $wert = @POOLoffset[$i] + (@POOLgain[$i] * @POOLvalue[$i]);
 
    ### Messwert auf 2 Nachkommastellen runden
    $wert = sprintf("%.2f", $wert);
 
    ###Ausgeben
    $hash->{READINGS}{@POOLnames[$i]}{VAL} = "$wert @POOLunits[$i]";
    $hash->{READINGS}{@POOLnames[$i]}{TIME} = TimeNow();
  }
  $hash->{STATE} = "OK";
}

1;
