From 754df2f7e5422b803d3730a9d9ab50d3c9b38bdc Mon Sep 17 00:00:00 2001
From: loredo
Date: Fri, 7 Feb 2014 13:04:29 +0000
Subject: [PATCH] GEOFANCY: dual-support for Geofancy.app and Geofency.app
git-svn-id: https://svn.fhem.de/fhem/trunk@4836 2b470e98-0d58-463d-a4d8-8e2adae1ed80
---
fhem/FHEM/98_GEOFANCY.pm | 163 +++++++++++++++++++++++++++------------
1 file changed, 114 insertions(+), 49 deletions(-)
diff --git a/fhem/FHEM/98_GEOFANCY.pm b/fhem/FHEM/98_GEOFANCY.pm
index c81fc0679..ae54b236d 100644
--- a/fhem/FHEM/98_GEOFANCY.pm
+++ b/fhem/FHEM/98_GEOFANCY.pm
@@ -25,9 +25,12 @@
# along with fhem. If not, see .
#
#
-# Version: 1.0.2
+# Version: 1.1.0
#
# Major Version History:
+# - 1.1.0 - 2014-02-06
+# -- Support for both apps: Geofency and Geofancy
+#
# - 1.0.0 - 2014-01-09
# -- First release
#
@@ -159,7 +162,11 @@ sub GEOFANCY_Set($@) {
###################################
sub GEOFANCY_CGI() {
- # /$infix?device=UUID&id=UUID&latitude=xx.x&longitude=xx.x&trigger=(enter|exit)
+# Geofancy
+# /$infix?device=UUIDdev&id=UUIDloc&latitude=xx.x&longitude=xx.x&trigger=(enter|exit)
+#
+# Geofency
+# /$infix?id=UUIDloc&name=locName&entry=(1|0)&date=DATE&latitude=xx.x&longitude=xx.x&device=UUIDdev
my ($request) = @_;
my $hash;
@@ -170,8 +177,11 @@ sub GEOFANCY_CGI() {
my $id;
my $lat;
my $long;
- my $trigger;
+ my $entry;
my $msg;
+ my $date;
+ my $time;
+ my $locName;
# data received
if ( $request =~ m,^(/[^/]+?)(?:\&|\?)(.*)?$, ) {
@@ -197,27 +207,35 @@ sub GEOFANCY_CGI() {
$webArgs->{$p} = $v;
}
- if ( !defined( $webArgs->{device} )
+ if (
+ !defined( $webArgs->{device} )
|| !defined( $webArgs->{id} )
- || !defined( $webArgs->{latitude} )
- || !defined( $webArgs->{longitude} )
- || !defined( $webArgs->{trigger} )
+ || (
+ !(
+ defined( $webArgs->{trigger} && $webArgs->{trigger} ne "" )
+ )
+ && !( defined( $webArgs->{entry} ) && $webArgs->{entry} ne "" )
+ )
|| $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 = " id=";
$msg .= $webArgs->{id} if ( $webArgs->{id} );
+ $msg .= " name=";
+ $msg .= $webArgs->{name} if ( $webArgs->{name} );
+ $msg .= " entry=";
+ $msg .= $webArgs->{entry} if ( $webArgs->{entry} );
+ $msg .= " trigger=";
+ $msg .= $webArgs->{trigger} if ( $webArgs->{trigger} );
+ $msg .= " date=";
+ $msg .= $webArgs->{date} if ( $webArgs->{date} );
$msg .= " latitude=";
$msg .= $webArgs->{latitude} if ( $webArgs->{latitude} );
$msg .= " longitude=";
$msg .= $webArgs->{longitude} if ( $webArgs->{longitude} );
- $msg .= " trigger=";
- $msg .= $webArgs->{trigger} if ( $webArgs->{trigger} );
+ $msg .= " device=";
+ $msg .= $webArgs->{device} if ( $webArgs->{device} );
Log3 $name, 3,
"GEOFANCY: Insufficient data received for webhook $link:\n"
@@ -227,27 +245,44 @@ sub GEOFANCY_CGI() {
"NOK\nInsufficient data received for webhook $link:\n" . $msg );
}
- $device = $webArgs->{device};
- $id = $webArgs->{id};
- $lat = $webArgs->{latitude};
- $long = $webArgs->{longitude};
- $trigger = $webArgs->{trigger};
+ # Geofancy.app
+ if ( defined $webArgs->{trigger} ) {
+ $id = $webArgs->{id};
+ $entry = $webArgs->{trigger};
+ $lat = $webArgs->{latitude};
+ $long = $webArgs->{longitude};
+ $device = $webArgs->{device};
+ }
+
+ # Geofency.app
+ elsif ( defined $webArgs->{entry} ) {
+ $id = $webArgs->{id};
+ $locName = $webArgs->{name};
+ $entry = $webArgs->{entry};
+ $date = $webArgs->{date};
+ $lat = $webArgs->{latitude};
+ $long = $webArgs->{longitude};
+ $device = $webArgs->{device};
+ }
+ else {
+ return "fatal error";
+ }
}
# no data received
else {
- Log3 undef, 3,
-"GEOFANCY: No data received, see API information on http://wiki.geofancy.com";
+ Log3 undef, 3, "GEOFANCY: No data received";
- return (
- "text/plain; charset=utf-8",
-"NOK No data received, see API information on http://wiki.geofancy.com"
- );
+ return ( "text/plain; charset=utf-8", "NOK No data received" );
}
# return error if unknown trigger
- return ( "text/plain; charset=utf-8", "$trigger NOK" )
- if ( $trigger ne "enter" && $trigger ne "exit" && $trigger ne "test" );
+ return ( "text/plain; charset=utf-8", "$entry NOK" )
+ if ( $entry ne "enter"
+ && $entry ne "1"
+ && $entry ne "exit"
+ && $entry ne "0"
+ && $entry ne "test" );
$hash = $defs{$name};
@@ -276,30 +311,36 @@ sub GEOFANCY_CGI() {
if $hash->{helper}{device_aliases}{$device};
Log3 $name, 4,
- "GEOFANCY $name: "
- . $device . ": id="
- . $id
- . " latitude="
- . $lat
- . " longitude="
- . $long
- . " trigger="
- . $trigger;
+"GEOFANCY $name: id=$id name=$locName entry=$entry date=$date lat=$lat long=$long dev=$device";
readingsBeginUpdate($hash);
+ # use time from device
+ if ( defined $date && $date ne "" ) {
+ $hash->{".updateTime"} = GEOFANCY_ISO8601UTCtoLocal($date);
+ $hash->{".updateTimestamp"} = FmtDateTime( $hash->{".updateTime"} );
+ $time = $hash->{".updateTimestamp"};
+ }
+
+ # use local FHEM time
+ else {
+ $time = TimeNow();
+ }
+
# General readings
readingsBulkUpdate( $hash, "state",
- "dev:$device trig:$trigger id:$id lat:$lat long:$long" );
+"id:$id name:$locName entry:$entry date:$date lat:$lat long:$long dev:$device"
+ );
+
+ $id = $locName if ( defined($locName) && $locName ne "" );
+
readingsBulkUpdate( $hash, "lastDevice", $device );
readingsBulkUpdate( $hash, "lastArr", $device . " " . $id )
- if $trigger eq "enter";
+ if ( $entry eq "enter" || $entry eq "1" );
readingsBulkUpdate( $hash, "lastDep", $device . " " . $id )
- if $trigger eq "exit";
+ if ( $entry eq "exit" || $entry eq "0" );
- my $time = TimeNow();
-
- if ( $trigger eq "enter" || $trigger eq "test" ) {
+ if ( $entry eq "enter" || $entry eq "1" || $entry eq "test" ) {
Log3 $name, 3, "GEOFANCY $name: $device arrived at $id";
readingsBulkUpdate( $hash, $device, "arrived " . $id );
readingsBulkUpdate( $hash, "currLoc_" . $device, $id );
@@ -307,7 +348,7 @@ sub GEOFANCY_CGI() {
readingsBulkUpdate( $hash, "currLocLong_" . $device, $long );
readingsBulkUpdate( $hash, "currLocTime_" . $device, $time );
}
- if ( $trigger eq "exit" ) {
+ if ( $entry eq "exit" || $entry eq "0" ) {
my $currReading;
my $lastReading;
@@ -343,13 +384,34 @@ sub GEOFANCY_CGI() {
readingsEndUpdate( $hash, 1 );
- $msg = "$trigger OK";
- $msg .= "\ndevice=$device id=$id lat=$lat long=$long trigger=$trigger"
- if ( $trigger eq "test" );
+ $msg = "$entry OK";
+ $msg .= "\ndevice=$device id=$id lat=$lat long=$long trigger=$entry"
+ if ( $entry eq "test" );
return ( "text/plain; charset=utf-8", $msg );
}
+sub GEOFANCY_ISO8601UTCtoLocal ($) {
+ my ($datetime) = @_;
+ $datetime =~ s/T/ /g if ( defined( $datetime && $datetime ne "" ) );
+ $datetime =~ s/Z//g if ( defined( $datetime && $datetime ne "" ) );
+
+ my (
+ $date, $time, $y, $m, $d, $hour,
+ $min, $sec, $hours, $minutes, $seconds, $timestamp
+ );
+
+ ( $date, $time ) = split( ' ', $datetime );
+ ( $y, $m, $d ) = split( '-', $date );
+ ( $hour, $min, $sec ) = split( ':', $time );
+ $m -= 01;
+ $timestamp = timegm( $sec, $min, $hour, $d, $m, $y );
+ ( $sec, $min, $hour, $d, $m, $y ) = localtime($timestamp);
+ $timestamp = timelocal( $sec, $min, $hour, $d, $m, $y );
+
+ return $timestamp;
+}
+
1;
=pod
@@ -358,9 +420,12 @@ sub GEOFANCY_CGI() {
GEOFANCY
+ Note: GEOFANCY is an extension to FHEMWEB. You need to install FHEMWEB to use GEOFANCY.
Define