##############################################
# $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 );
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);
}
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); }
 
for (my $i=1;$i<$#POOLvalue+1;$i++)
{
### fertigen Messwert berechnen
my $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;
