diff --git a/fhem/contrib/99_andnotify.pm b/fhem/contrib/99_andnotify.pm new file mode 100644 index 000000000..004f2ce9e --- /dev/null +++ b/fhem/contrib/99_andnotify.pm @@ -0,0 +1,191 @@ +package main; + +use JSON; +use HTTP::Request; +use LWP::UserAgent; +use IO::Socket::SSL; +use utf8; + +my @gets = ('dummy'); + +sub +andnotify_Initialize($) +{ +my ($hash) = @_; + $hash->{DefFn} = "andnotify_Define"; + $hash->{StateFn} = "andnotify_SetState"; + $hash->{SetFn} = "andnotify_Set"; + $hash->{AttrList} = "loglevel:0,1,2,3,4,5"; + +} + +sub +andnotify_SetState($$$$) +{ + my ($hash, $tim, $vt, $val) = @_; + + $val = $1 if($val =~ m/^(.*) \d+$/); + return "Undefined value $val" if(!defined($it_c2b{$val})); + return undef; +} + + +sub +andnotify_Define($$) +{ + my ($hash, $def) = @_; + + my @args = split("[ \t]+", $def); + + if (int(@args) < 1) + { + return "energy_Define: too much arguments. Usage:\n" . + "define andnotify "; + } + + $hash->{APIKEY} = $args[2]; + $hash->{REGIDS}= $args[3]; + $hash->{STATE} = 'Initialized'; + + Log 3, "$hash->{NAME} APIKEY: $hash->{APIKEY} REGIDS: $hash->{REGIDS}"; + + return undef; +} + +sub andnotify_Set($@) +{ + my $json = JSON->new->allow_nonref; + my ($hash, @a) = @_; + my $name = $hash->{NAME}; + my $apikey = $hash->{APIKEY}; + my $count = @a; + + my $arg = lc($a[1]); + my $cont1 = ucfirst($arg); + my $cont2 = ""; + my $cont3 = ""; + my $cont4 = ""; + my $cont5 = ""; + my $cont6 = ""; + my $cont7 = ""; + my $cont8 = ""; + my $cont9 = ""; + + if (defined $a[2]) { $cont2 = $a[2]} + if (defined $a[3]) { $cont3 = $a[3]} + if (defined $a[4]) { $cont4 = $a[4]} + if (defined $a[5]) { $cont5 = $a[5]} + if (defined $a[6]) { $cont6 = $a[6]} + if (defined $a[7]) { $cont7 = $a[7]} + if (defined $a[8]) { $cont8 = $a[8]} + if (defined $a[9]) { $cont9 = $a[9]} + + my $fullcmd="$a[2]"; + + for (my $i=3;$i<$count;$i+=1){ $fullcmd="$fullcmd $a[$i]";} + + my @param = split(/\|/, $fullcmd); + +if ( $arg eq "regids" ) +{ + $hash->{REGIDS}=$fullcmd; + Log 3, "AndNotify $hash->{NAME} SET REGIDS: $hash->{REGIDS}"; +} + +if ( $arg eq "send" ) +{ + my $client = LWP::UserAgent->new(); + my @registration_ids = split(/\|/, $hash->{REGIDS}); + my $unix_timestamp = time*1000; + + if ($param[5]<1) + { + $param[5]="0"; + } + + if (substr($param[0],0,5) eq "file:") + { + my @msg = split(/\ /, $param[0]); + my @temp_string; + my $document; + my $iii=0; + foreach (@msg){ + @temp_string = split(/\:/, $_); + if ($iii eq 0) + { + my $file = $temp_string[1]; + $document = do { + local $/ = undef; + open my $fh, "<", $file or Log 3, "Notify -> could not open $file"; + <$fh>; + }; + $iii=$iii+1; + } + else + { + $document =~ s/$temp_string[0]/$temp_string[1]/g; + } + } + $param[0]=$document; + } + + my $data = { + registration_ids => [ "$registration_ids[0]", "$registration_ids[1]", "$registration_ids[2]", "$registration_ids[3]", "$registration_ids[4]", "$registration_ids[5]", "$registration_ids[6]", "$registration_ids[7]", "$registration_ids[8]", "$registration_ids[9]" ], + data => { + message => $param[0], + tickerText => $param[1], + contentTitle => $param[2], + contentText => $param[3], + timestamp => $unix_timestamp, + icon => $param[4], + customid => $param[5] + } + }; + + my $req = HTTP::Request->new(POST => "https://android.googleapis.com/gcm/send"); + $req->header(Authorization => 'key='.$apikey); + $req->header('Content-Type' => 'application/json; charset=UTF-8'); + $req->content($json->encode($data)); + $client->request($req); + Log 3, "Notify gesendet"; +} + +if ( $arg eq "wake" ) +{ + my $client = LWP::UserAgent->new(); + my @registration_ids = split(/\|/, $hash->{REGIDS}); + my $unix_timestamp = time*1000; + my $data = { + registration_ids => [ "$registration_ids[0]", "$registration_ids[1]", "$registration_ids[2]", "$registration_ids[3]", "$registration_ids[4]", "$registration_ids[5]", "$registration_ids[6]", "$registration_ids[7]", "$registration_ids[8]", "$registration_ids[9]" ], + data => { + wake => 1 + } + }; + my $req = HTTP::Request->new(POST => "https://android.googleapis.com/gcm/send"); + $req->header(Authorization => 'key='.$apikey); + $req->header('Content-Type' => 'application/json; charset=UTF-8'); + $req->content($json->encode($data)); + $client->request($req); + Log 3, "Notify wake gesendet"; +} + +if ( $arg eq "sleep" ) +{ + my $client = LWP::UserAgent->new(); + my @registration_ids = split(/\|/, $hash->{REGIDS}); + my $unix_timestamp = time*1000; + my $data = { + registration_ids => [ "$registration_ids[0]", "$registration_ids[1]", "$registration_ids[2]", "$registration_ids[3]", "$registration_ids[4]", "$registration_ids[5]", "$registration_ids[6]", "$registration_ids[7]", "$registration_ids[8]", "$registration_ids[9]" ], + data => { + sleep => 1 + } + }; + my $req = HTTP::Request->new(POST => "https://android.googleapis.com/gcm/send"); + $req->header(Authorization => 'key='.$apikey); + $req->header('Content-Type' => 'application/json; charset=UTF-8'); + $req->content($json->encode($data)); + $client->request($req); + Log 3, "Notify sleep gesendet"; +} + +}