"
+ if ( int(@a) != 3 );
+ my $name = $a[0];
+ my $infix = $a[2];
+
+ $hash->{fhem}{infix} = $infix;
+
+ GEOFANCY_addExtension( $name, "GEOFANCY_CGI", $infix );
+
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, "state", "initialized" );
+ readingsEndUpdate( $hash, 1 );
+ return undef;
+}
+
+###################################
+sub GEOFANCY_Undefine($$) {
+
+ my ( $hash, $name ) = @_;
+
+ GEOFANCY_removeExtension( $hash->{fhem}{infix} );
+
+ return undef;
+}
+
+###################################
+sub GEOFANCY_Set($@) {
+ my ( $hash, @a ) = @_;
+ my $name = $hash->{NAME};
+ my $state = $hash->{STATE};
+
+ Log3 $name, 5, "GEOFANCY $name: called function GEOFANCY_Set()";
+
+ return "No Argument given" if ( !defined( $a[1] ) );
+
+ my $usage = "Unknown argument " . $a[1] . ", choose one of clear:readings";
+
+ # clear
+ if ( $a[1] eq "clear" ) {
+ Log3 $name, 2, "GEOFANCY set $name " . $a[1];
+
+ if ( $a[2] ) {
+
+ # readings
+ if ( $a[2] eq "readings" ) {
+ delete $hash->{READINGS};
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, "state", "clearedReadings" );
+ readingsEndUpdate( $hash, 1 );
+ }
+
+ }
+
+ else {
+ return "No Argument given, choose one of readings ";
+ }
+ }
+
+ # return usage hint
+ else {
+ return $usage;
+ }
+
+ return undef;
+}
+
+############################################################################################################
+#
+# Begin of helper functions
+#
+############################################################################################################
+
+###################################
+sub GEOFANCY_CGI() {
+
+ # /$infix?device=UUID&id=UUID&latitude=xx.x&longitude=xx.x&trigger=(enter|exit)
+ my ($request) = @_;
+
+ my $hash;
+ my $name;
+ my $link;
+ my $URI;
+ my $device;
+ my $id;
+ my $lat;
+ my $long;
+ my $trigger;
+ my $msg;
+
+ # data via GET
+ if ( $request =~ m,^(/[^/]+)\?((.*)?)?$, ) {
+ $link = $1;
+ $URI = $2;
+
+ # get device name
+ $name = $data{FWEXT}{$link}{deviceName} if ( $data{FWEXT}{$link} );
+
+ # return error if no such device
+ return ( "text/plain; charset=utf-8",
+ "NOK No GEOFANCY device for webhook $link" )
+ unless ($name);
+
+ # extract values from URI
+ my $webArgs;
+ foreach my $pv ( split( "&", $URI ) ) {
+ next if ( $pv eq "" );
+ $pv =~ s/\+/ /g;
+ $pv =~ s/%([\dA-F][\dA-F])/chr(hex($1))/ige;
+ my ( $p, $v ) = split( "=", $pv, 2 );
+
+ $webArgs->{$p} = $v;
+ }
+
+ if ( !defined( $webArgs->{device} )
+ || !defined( $webArgs->{id} )
+ || !defined( $webArgs->{latitude} )
+ || !defined( $webArgs->{longitude} )
+ || !defined( $webArgs->{trigger} )
+ || $webArgs->{device} eq ""
+ || $webArgs->{id} eq ""
+ || $webArgs->{latitude} eq ""
+ || $webArgs->{longitude} eq ""
+ || $webArgs->{trigger} eq "" )
+ {
+ $msg = "device=";
+ $msg .= $webArgs->{device} if ( $webArgs->{device} );
+ $msg .= " id=";
+ $msg .= $webArgs->{id} if ( $webArgs->{id} );
+ $msg .= " latitude=";
+ $msg .= $webArgs->{latitude} if ( $webArgs->{latitude} );
+ $msg .= " longitude=";
+ $msg .= $webArgs->{longitude} if ( $webArgs->{longitude} );
+ $msg .= " trigger=";
+ $msg .= $webArgs->{trigger} if ( $webArgs->{trigger} );
+
+ Log3 $name, 3,
+ "GEOFANCY: Insufficient data received for webhook $link:\n"
+ . $msg;
+
+ return ( "text/plain; charset=utf-8",
+ "NOK\nInsufficient data received for webhook $link:\n" . $msg );
+ }
+
+ $device = $webArgs->{device};
+ $id = $webArgs->{id};
+ $lat = $webArgs->{latitude};
+ $long = $webArgs->{longitude};
+ $trigger = $webArgs->{trigger};
+ }
+
+ # data via POST
+ else {
+ Log3 undef, 3,
+"GEOFANCY: Data transfer via POST not implemented. (request URI: $request)";
+
+ return (
+ "text/plain; charset=utf-8",
+"NOK Data transfer via POST not implemented. (request URI: $request)"
+ );
+ }
+
+ # return error if unknown trigger
+ return ( "text/plain; charset=utf-8", "$trigger NOK" )
+ if ( $trigger ne "enter" && $trigger ne "exit" && $trigger ne "test" );
+
+ $hash = $defs{$name};
+
+ # Device alias handling
+ #
+ delete $hash->{helper}{device_aliases}
+ if $hash->{helper}{device_aliases};
+ delete $hash->{helper}{device_names}
+ if $hash->{helper}{device_names};
+
+ if ( defined( $attr{$name}{devAlias} ) ) {
+ my @devices = split( ' ', $attr{$name}{devAlias} );
+
+ if (@devices) {
+ foreach (@devices) {
+ my @device = split( ':', $_ );
+ $hash->{helper}{device_aliases}{ $device[0] } =
+ $device[1];
+ $hash->{helper}{device_names}{ $device[1] } =
+ $device[0];
+ }
+ }
+ }
+
+ $device = $hash->{helper}{device_aliases}{$device}
+ if $hash->{helper}{device_aliases}{$device};
+
+ Log3 $name, 4,
+ "GEOFANCY $name: "
+ . $device . ": id="
+ . $id
+ . " latitude="
+ . $lat
+ . " longitude="
+ . $long
+ . " trigger="
+ . $trigger;
+
+ readingsBeginUpdate($hash);
+ readingsBulkUpdate( $hash, $device, $trigger . " " . $id );
+ readingsBulkUpdate( $hash, "lastDevice", $device );
+ readingsBulkUpdate( $hash, "lastEnter", $device . " " . $id )
+ if $trigger eq "enter";
+ readingsBulkUpdate( $hash, "lastExit", $device . " " . $id )
+ if $trigger eq "exit";
+ readingsBulkUpdate( $hash, "lastId_" . $device, $id );
+ readingsBulkUpdate( $hash, "lastLat_" . $device, $lat );
+ readingsBulkUpdate( $hash, "lastLong_" . $device, $long );
+ readingsBulkUpdate( $hash, "lastTrigger_" . $device, $trigger );
+ readingsBulkUpdate( $hash, "state",
+ "dev:$device trig:$trigger id:$id lat:$lat long:$long" );
+ readingsEndUpdate( $hash, 1 );
+
+ $msg = "$trigger OK";
+ $msg .= "\ndevice=$device id=$id lat=$lat long=$long trigger=$trigger"
+ if ( $trigger eq "test" );
+
+ return ( "text/plain; charset=utf-8", $msg );
+}
+
+1;
+
+=pod
+=begin html
+
+
+GEOFANCY
+
+
+=end html
+=cut
diff --git a/fhem/MAINTAINER.txt b/fhem/MAINTAINER.txt
index a26bf7469..7e4a4fe19 100644
--- a/fhem/MAINTAINER.txt
+++ b/fhem/MAINTAINER.txt
@@ -171,6 +171,7 @@ FHEM/95_holiday.pm rudolfkoenig http://forum.fhem.de Sonstiges
FHEM/95_remotecontrol.pm ulimaass http://forum.fhem.de Frontends
FHEM/98_apptime.pm martinp876 http://forum.fhem.de Sonstiges
FHEM/98_CULflash.pm rudolfkoenig http://forum.fhem.de Sonstiges
+FHEM/98_GEOFANCY.pm loredo http://forum.fhem.de Unterstuetzende Dienste
FHEM/98_HMinfo.pm martinp876 http://forum.fhem.de HomeMatic
FHEM/98_Heating_Control.pm dietmar63 http://forum.fhem.de Unterstuetzende Dienste
FHEM/98_JsonList.pm mfr69bs http://forum.fhem.de Automatisierung