Geofency Modul

Prinzipiell geht’s mit EgiGeoZone Geofence

aber auch

10.04.2015 11:36:19*| Geofency*| Malformed data: Array
(
)

und $_POST scheint wirklich leer zu sein. Eigene Parameter werden aber auch nicht übergeben, obwohl ich sie an die URL gehängt habe.

pass das Modul leicht an…

Gemacht, und geht schon mal für die APP Geofancy.
GUIDs, da habe ich noch keinen Plan, mal viel lesen.:slight_smile:

Eigentlich sollte doch

http://....ipmagic.de/hook/geofency?test=12345

dazu führen, dass „test=12345“ bei Malformed… angezeigt wird. Oder wo ist mein Denkfehler?

Ja. Das Modul wertet nur POST Daten aus. Alles was ?.. ist, kommt als GET rein.

paresy

Hallo,
habe mal das Modul schnell zum testen umgestrickt für die App GEOFANCY.

 <?

	class Geofency extends IPSModule
	{
		
		public function __construct($InstanceID)
		{
			//Never delete this line!
			parent::__construct($InstanceID);
			
			//These lines are parsed on Symcon Startup or Instance creation
			//You cannot use variables here. Just static values.
			$this->RegisterPropertyString("Username", "");
			$this->RegisterPropertyString("Password", "");
		}
	
		public function ApplyChanges()
		{
			//Never delete this line!
			parent::ApplyChanges();
			
			$sid = $this->RegisterScript("Hook", "Hook", "<? //Do not delete or modify.
include(IPS_GetKernelDirEx().\"scripts/__ipsmodule.inc.php\");
include(\"../modules/SymconMisc/Geofancy/module.php\");
(new Geofency(".$this->InstanceID."))->ProcessHookData();");
			$this->RegisterHook("/hook/geofency", $sid);
		}
		
		private function RegisterHook($Hook, $TargetID)
		{
			$ids = IPS_GetInstanceListByModuleID("{015A6EB8-D6E5-4B93-B496-0D3F77AE9FE1}");
			if(sizeof($ids) > 0) {
				$hooks = json_decode(IPS_GetProperty($ids[0], "Hooks"), true);
				$found = false;
				foreach($hooks as $index => $hook) {
					if($hook['Hook'] == "/hook/geofency") {
						if($hook['TargetID'] == $TargetID)
							return;
						$hooks[$index]['TargetID'] = $TargetID;
						$found = true;
					}
				}
				if(!$found) {
					$hooks[] = Array("Hook" => "/hook/geofency", "TargetID" => $TargetID);
				}
				IPS_SetProperty($ids[0], "Hooks", json_encode($hooks));
				IPS_ApplyChanges($ids[0]);
			}
		}
	
		/**
		* This function will be available automatically after the module is imported with the module control.
		* Using the custom prefix this function will be callable from PHP and JSON-RPC through:
		*
		* GEO_ProcessHookData($id);
		*
		*/
		public function ProcessHookData()
		{
			//workaround for bug
			if(!isset($_IPS))
				global $_IPS;
			if($_IPS['SENDER'] == "Execute") {
				echo "This script cannot be used this way.";
				return;
			}
			if(!isset($_POST['device']) || !isset($_POST['id']) || !isset($_POST['trigger'])) {
				IPS_LogMessage("Geofancy", "Malformed data: ".print_r($_POST, true));
				return;
			}
			$trigger=(($_POST['trigger']));
      
      if ($trigger == "test") {
	  	  IPS_LogMessage("Geofancy", "Neue Test Daten: ".print_r($_POST, true));
       return;
      }
      if ($trigger == "exit") {
	  	  $anwesend = 0;
      }
      if ($trigger == "enter") {
	  	  $anwesend = 1;
      }

//      if ($trigger != "test") {
	  	  IPS_LogMessage("Geofancy", "Neue Daten: ".print_r($_POST, true));
//      }
      
/*
			$deviceID = $this->CreateInstanceByIdent($this->InstanceID, $this->ReduceGUIDToIdent($_POST['device']), "Device");
			SetValue($this->CreateVariableByIdent($deviceID, "Latitude", "Latitude", 2), floatval($_POST['latitude']));
			SetValue($this->CreateVariableByIdent($deviceID, "Longitude", "Longitude", 2), floatval($_POST['longitude']));
			SetValue($this->CreateVariableByIdent($deviceID, "Timestamp", "Timestamp", 1, "~UnixTimestamp"), intval(strtotime($_POST['date'])));
			SetValue($this->CreateVariableByIdent($deviceID, $this->ReduceGUIDToIdent($_POST['id']), utf8_decode($_POST['name']), 0, "~Presence"), intval($_POST['entry']) > 0);
*/      
			$deviceID = $this->CreateInstanceByIdent($this->InstanceID, $this->ReduceGUIDToIdent($_POST['device']), "Device");
			SetValue($this->CreateVariableByIdent($deviceID, "Latitude", "Latitude", 2), floatval($_POST['latitude']));
			SetValue($this->CreateVariableByIdent($deviceID, "Longitude", "Longitude", 2), floatval($_POST['longitude']));
			SetValue($this->CreateVariableByIdent($deviceID, "Timestamp", "Timestamp", 1, "~UnixTimestamp"), intval($_POST['timestamp']));
			SetValue($this->CreateVariableByIdent($deviceID, $this->ReduceGUIDToIdent($_POST['id']), utf8_decode($_POST['id']), 0, "~Presence"), intval($anwesend) > 0);
	
		}
		
		private function ReduceGUIDToIdent($guid) {
			return str_replace(Array("{", "-", "}"), "", $guid);
		}
		
		private function CreateCategoryByIdent($id, $ident, $name)
		 {
			 $cid = @IPS_GetObjectIDByIdent($ident, $id);
			 if($cid === false)
			 {
				 $cid = IPS_CreateCategory();
				 IPS_SetParent($cid, $id);
				 IPS_SetName($cid, $name);
				 IPS_SetIdent($cid, $ident);
			 }
			 return $cid;
		}
		
		private function CreateVariableByIdent($id, $ident, $name, $type, $profile = "")
		 {
			 $vid = @IPS_GetObjectIDByIdent($ident, $id);
			 if($vid === false)
			 {
				 $vid = IPS_CreateVariable($type);
				 IPS_SetParent($vid, $id);
				 IPS_SetName($vid, $name);
				 IPS_SetIdent($vid, $ident);
				 if($profile != "")
					IPS_SetVariableCustomProfile($vid, $profile);
			 }
			 return $vid;
		}
		
		private function CreateInstanceByIdent($id, $ident, $name, $moduleid = "{485D0419-BE97-4548-AA9C-C083EB82E61E}")
		 {
			 $iid = @IPS_GetObjectIDByIdent($ident, $id);
			 if($iid === false)
			 {
				 $iid = IPS_CreateInstance($moduleid);
				 IPS_SetParent($iid, $id);
				 IPS_SetName($iid, $name);
				 IPS_SetIdent($iid, $ident);
			 }
			 return $iid;
		}
		
	
	}

?>

Geht soweit, jetzt muss es mal in „schön“.:smiley:

@Ralf,

dann müsstest du das Modul doch nur auf GET und dein VAR’s abändern, und versuchen, oder ?
Bin mir da unsicher, würde es aber so probieren.

OT

Hm, der Radius bei Geofancy und Geohopper ist einfach zu gross,
Erkennug der Home Zone.:confused:
Muss schon einige 200 Meter vom Haus weg sein.
Ist aber kein Probelm von IPS ! :smiley:
Ansonsten klappt das, Versuch war es Wert.:slight_smile:

Hallo Paresy,

welche iPhone-App verwendest Du konkret?
Es gibt im AppStore etwas das schreibt sich „Geofency Zeiterfassung“ - sieht aber nach den Screenshots anders aus…
Dann gibt es da etwas das schreibt sich „Geofancy“, sieht dann aber so aus wie das was Thomas gepostet hat…

Joachim

Geofency Zeiterfassung ist die richtige App :slight_smile:

Nutze ich seit Ewigkeiten und ist das Geld wirklich wert.

paresy

Ich will mal ein kurzes Feedback geben.

Ich nutze das Modul mit Geofency auf 2 IOS Geräten. Frau und ich. Ich habe es die letzten 4-6 Wochen so weit getrieben, dass ich nicht nur die Anwesenheit damit simuliere sondern auch die Alarmanlage automatisiert an/ausschalte und muss sagen, dass Geofency mittlerweile zu 98 % zuverlässig arbeitet.

Die einzigen Verbesserungsvorschläge wären:

A) Es sollte ein kleinerer Radius Möglich sein.
B) Das Webhook funktioniert beim Verlassen/Betreten der Zonen zu Fuß zu unzuverlässig. Mit dem Auto 100%

Ich hab auch mal ne Frage: Läuft das mittlerweile auch in der Stable Windows Version? Hab nicht gesehen, dass wir im Linux-Testbereich sind. Tapatalk ist schuld :slight_smile: Ich habe mir die App grad gekauft…

Baba, due PHP-MODULE sind noch Linux only

hm vielleicht sollte ich doch irgendwann mal auf linux umsteigen, wollte eigentlich warten bis linux stable ist, weil ich noch nicht soo fit in ips bin

Hallo Babba.

Bin mir sicher, dass die zwei Entwicklungsstränge in absehbarer Zeit wieder zusammen wachsen. Also am besten einfach abwarten.

Okay dann werde ich noch weiter warten :slight_smile:

Hi,

hab grad mal die App auf dem iPhone installiert und im /webfront/user Verzeichnis 2 PHP Dateien angelegt welche jeweils eine bool Variable (ist anwesend) auf true, bzw. false setzt;

und das ganze unter Windows und ohne Modul, lüppt.

mfg

BerndJ

Cool, würdest du die Dateien zur Verfügung stellen?

Hi,

nicht Dein Ernst, oder?

<?

SetValueBoolean(57628 /*[Technik\Tracking\Geofency\Bernd at Home iP5S]*/, true);

?>

Den Inhalt der zweiten Datei brauch ich hoffentlich nicht kopieren, ein Tausch von true zu false reicht vollkommen aus.

Wichtig ist der Standort und der Name der Datei, denn der muss in Geofency eingetragen werden.

mfg

BerndJ

Hallo Bernd, hatte das irgendwie anders verstanden, hab mit dem /webfront/user/ Verzeichnis bisher noch nichts gemacht, bin noch nicht solange dabei. Das setzten der bool Variablen hätte ich natürlich auch so hinbekommen. trotzdem danke, jetzt klappts auch bei mir

Hallo an alle,

nur so zur Info:

Hab hier 3 iBeacons am Laufen und bildete mir ein: dass ist eine Art GPS im Hausbereich.

Momentan ist dem leider nicht so.

Ich habe allen 3 Beacons die jeweilige Position in der App beigebracht und hatte Hoffnung dass die zurück gemeldete Position in der App aus dem Abstand zu den jeweiligen Beacons errechnet wird.

Weit gefehlt, in IPS sehe ich nur die bei den Beacons hinterlegte Position.

Gibt Geofency dass nicht her?, oder wie soll in der Praxis die genaue Ortung funktionieren?

mfg

BerndJ