Geofency Modul

ich hab da ein Problem,
seit dem 17.11 scheint es nicht mehr zu funktionieren. Bekomme folgende Meldung:
22.11.2017 05:34:07 | PHP | Error: Error: Call to protected method Geofency::ProcessHookData() from context ‚‘
Error in Script /var/lib/symcon/scripts/14429.ips.php on Line 4
134 in IPSLibrary/app/core/IPSLogger/IPSLogger.inc.php (call IPSLogger_Out)
33 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_Err)
121 in IPSLibrary/app/core/IPSLogger/IPSLogger_PhpErrorHandler.inc.php (call IPSLogger_PhpErrorHandler)
in IPSLogger_PhpFatalErrorHandler

Vorher funktionierte es tadellos.

hier noch das script (hook)

<? //Do not delete or modify.
include(IPS_GetKernelDirEx().„scripts/__ipsmodule.inc.php“);
include("…/modules/SymconMisc/Geofency/module.php");
(new Geofency(21805 /[iPhone Dirk]/))->ProcessHookData();

ist auch alles eingerichtet. Ich weis nicht warum

Welche IPS Version läuft denn? Das ist Gegenstand der Diskussion. In neueren IPS Versionen ist das Skript nicht mehr notwendig daher kann die Methode protected sein. Sollte es sich aber eine ältere Version sein das bräuchte man zwei Methoden Aufrufe. Ich hatte das auch mal eingebaut das dies sowohl mit alten als auch neuen IPS Versionen funktioniert indem die IPS Version geprüft wird und davon abhängig eine Methode aufgerufen wird bzw das Skript gelöscht. Dies ist momentan aber wieder rausgenommen worden. Paresy wollte sich da noch festlegen wie er das lösen will bzw. welche Version notwendig ist damit das Modul funktioniert. Ich persönlich wäre ja dafür die Version auszuwerten und unterschiedliche Methoden aufzurufen. So mache ich das mit anderen Modulen auch und dann funktioniert das sowohl mit alten als auch neuen Versionen von IPS 4.x

Um das Problem vorüber gehend zu lösen musst Du im Module Ordner die Module.php bearbeiten und die Methode ProcessHookData auf Public ändern dann sollte es so lange funktionieren bis ein Modul Update erfolgt und sich Paresy entschieden hat wie dies zu lösen ist.

Hi Dirk,

magst du mal schauen, ob im WebHook der GeoFency Hook auf die Instanz oder auf das Skript zeigt? Das müsste man am Namen erkennen können.

paresy

Also bei mir zeigt der Webhook auf das script

Ah dann bist Du nicht alleine, das Problem hatte ich auch und daher hatte ich das geändert. Per Hand kannst Du das nämlich selber nicht korrigieren, weil es nicht möglich ist eine Instanz als Webhook zu setzten. Das geht in der Webhook Instanz nicht, da meckert IPS das eine Instanz nicht als Ziel gültig ist, daher kann das nur aus einem Modul selber verändert werden und das Skript auch gelöscht insofern es in der IPS Version nicht mehr benutzt wird. Daher müsste das dann auch aus dem Modul selber geändert werden. Mal sehen was Paresy dazu sagt.

du meinst sicherlich die Module im Ordner (Geofency)?
die Module.php bearbeiten und die Methode ProcessHookData auf Public ändern --> Wo muss ich das genau ändern?

Danke

Zeile 44 protected gegen public austauschen. Das ist aber nur eine vorübergehende Lösung bis Paresy sich entschieden hat wie er das lösen will.

Eher bis ich herausgefunden habe, warum bei einigen Leuten im WebHook das Skript anstatt der Instanz angegeben ist. Normalerweise sollte dieses automatisch auf die Instanz aktualisiert werden.

paresy

Falls du eine neuere IP-Symcon Version besitzt kannst Du auch in die Instanz Webhook unter Kerninstanzen gehen und dort den Webhook für Geofency löschen. Anschließend löscht Du das Skript von Geofeny, auf das der Webhook gezeigt hatte.

Dann führst Du folgendes Skript einmal aus ( passende ObjektID für die Geofency Instanz angeben)


$id = 52118 /*[Geofency]*/;
RegisterHook("/hook/geofency", $id);

function RegisterHook($WebHook, $id) {
			$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'] == $WebHook) {
						if($hook['TargetID'] == $id)
							return;
						$hooks[$index]['TargetID'] = $id;
						$found = true;
					}
				}
				if(!$found) {
					$hooks[] = Array("Hook" => $WebHook, "TargetID" => $id);
				}
				IPS_SetProperty($ids[0], "Hooks", json_encode($hooks));
				IPS_ApplyChanges($ids[0]);
			}
		}

danach must Du nichts im Modul selber ändern, also von protected umstellen, dann sollte der Hook auf die Instanz zeigen und dann sollte das auch funktionieren ohne Fehlermeldung.

Klappt so nicht.

die ID ist die unter den Kerninstanzen liegende Geofency (also mein Handy)

<?
$id = 21805 /[iPhone Dirk]/;
RegisterHook("/hook/geofency", $id);

function RegisterHook($WebHook) {
$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‘] == $WebHook) {
if($hook[‚TargetID‘] == $id)
return;
$hooks[$index][‚TargetID‘] = $id;
$found = true;
}
}
if(!$found) {
$hooks = Array(„Hook“ => $WebHook, „TargetID“ => $id);
}
IPS_SetProperty($ids[0], „Hooks“, json_encode($hooks));
IPS_ApplyChanges($ids[0]);
}
}
?>

folgende Fehlermeldung kommt:

Notice: Undefined variable: id in /var/lib/symcon/scripts/51438.ips.php on line 19

Warning: Erwartete Wert des Typs int für TargetID in /var/lib/symcon/scripts/51438.ips.php on line 21

Du hast das Script von Fonzo falsch kopiert.
Da fehlt was in der Zeile function RegisterHook(…
Michael

Perfekt, das war es und alles ist wieder schick. Danke für Eure Hilfe

Ich wollte nur kurz noch mal melden, dass ich die Änderungen von Fonzo alle eingebaut habe. Der RegisterHook Fehler sollte nun auch erledigt sein :slight_smile:

paresy

Super, funktioniert perfekt nach einem ersten Test. Danke! :loveips:

Einen kleinen Schönheitsfehler gibt es noch: In der vorherigen Modul-Version hießen die Eintrittskoordinaten „current*“, jetzt werden neue Variablen angelegt und groß geschrieben („Current*“). Ich habe einfach die alten gelöscht, ich hoffe, dass es damit erledigt ist.

Super, vielen Dank! Richtig mega wäre es jetzt noch wenn die Doku aktualisiert würde :wink:

Danke Pitti

Kannst Dir ja überlegen was Dir fehlt und das ausformuliert posten dann kann man das ergänzen ;).

Netter Versuch :wink:

Nein, mal im Ernst. Soweit ich es überblicke sind folgende Variablen hinzugekommen:

[ul]
[li]Current Latitude[/li][li]Current Longitude[/li][li]Direction[/li][li]Distance[/li][li]Orientation[/li][/ul]

Diese sind in der Doku im Repository noch nicht aufgeführt. Ist bestimmt für viele hilfreich die das Modul nutzen möchten und nicht erst alle Posts im Forum durchlesen wollen.

Wäre einfach nur nett und hilfreich. Ich habe den Thread nur am Rande verfolgt und finde die Entwicklung toll, aber habe die neuen Features selbst noch nicht genutzt und kann deshalb auch nicht dokumentieren wie alles korrekt zusammenhängt. Würde mich wie gesagt - durch diesen Thread arbeiten und hoffen das ich alles verstehe :wink:

Ciao Heiko

Hallo zusammen,

da ich diese Erweiterung angestoßen habe - und sie dankenswerterweise auch so schnell umgesetzt wurden - hier mein Vorschlag für die Ergänzung der Dokumentation des Moduls:

Latitude

  • Float
  • Breitengrad (Mitte des Geofences) der letzten Aktivität

Longitude

  • Float
  • Längengrad (Mitte des Geofences) der letzten Aktivität

aktuelle Longitude (CurrentLongitude)

  • Float
  • Proximity-Koordinaten, also die aktuellen Koordinaten bei Ein- oder Austritt (äusserer Umkreis des Geofences), falls „Aktuelle Position senden“ in der App beim Webhook gewählt wurde

aktuelle Latitude (CurrentLatitude)

  • Float
  • Proximity-Koordinaten, also die aktuellen Koordinaten bei Ein- oder Austritt (äusserer Umkreis des Geofences), falls „Aktuelle Position senden“ in der App beim Webhook gewählt wurde

Direction

  • Integer
  • Azimutwinkel (Richtung in Grad) des aktuellen Ein-/Austrittspunktes bezogen auf die Mitte des Geofence-Kreises, falls „Aktuelle Position senden“ in der App beim Webhook gewählt wurde

Distance

  • Float
  • Abstand (in Meter) des aktuellen Ein-/Austrittspunktes bezogen auf die Mitte des Geofence-Kreises, falls „Aktuelle Position senden“ in der App beim Webhook gewählt wurde

Distance

  • Integer
  • Himmelsrichtung (als Name) des aktuellen Ein-/Austrittspunktes bezogen auf die Mitte des Geofence-Kreises, falls „Aktuelle Position senden“ in der App beim Webhook gewählt wurde

Jetzt müsste das nur noch jemand ggf. prüfen und dann in Github übernehmen.:slight_smile:

Schönen dritten Advent!

Carsten

…der letzte Eintrag soll heißen:

Orientation

  • Integer
  • Himmelsrichtung (als Name) des aktuellen Ein-/Austrittspunktes bezogen auf die Mitte des Geofence-Kreises, falls „Aktuelle Position senden“ in der App beim Webhook gewählt wurde

Danke, ich habe dies so in das Readme übernommen und einen Pull Request erstellt.