Modul: 98_livetracking - Geokoordinaten von OwnTracks / Life360 / Swarm (4Sq)

Begonnen von Markus M., 22 Mai 2015, 02:01:46

Vorheriges Thema - Nächstes Thema

swifty

Hallo,

;D wollte nur DANKE! sagen. Funktioniert sofort. Perfekt.  ;D
Zusammen mit mqtt und owntracks.

Jan

Markus M.

Schön dass es klappt.

OpenPaths ist übrigens mal wieder nicht erreichbar, wird vermutlich auch nicht mehr aktiv gepflegt.
Ich werde das also wahrscheinlich demnächst mal aus dem Modul entfernen.
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

jody

Hi Markus,

ich will an dieser Stelle einfach mal DANKE für das tolle Modul sagen.

Ist genau das, was ich gesucht habe.

Viele Grüße

Johannes
Cubietruck
CUL SlowRF
CUL Homematic
ZWave

stromer-12

Zitat von: FHEM-Wohnung am 22 Juni 2018, 22:46:26
Weis jemand wie das mit der Google API ist? Ich soll dort ein kostenlosen 12 Monate Test abschließen. 300$ stehen mir da zur Verfügung...?
Kostet dieser Dienst im privaten Rahmen etwas?
Ich habe mir mit StaticMapLite  meine Grafiken erstellt.
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

carlos

Hallo,
Ich würde das modul gerne mit traccar einsetzen.
Mein Traccar server published folgendes an meinen mosquito:

{"position":{"id":14935,"attributes":{"batteryLevel":61,"distance":0.06,"totalDistance":4132002.73,"motion":false},"deviceId":1,"type":null,"protocol":"osmand","serverTime":"2018-10-31T22:14:10.290+0000","deviceTime":"2018-10-31T22:14:07.000+0000","fixTime":"2018-10-31T22:14:07.000+0000","outdated":false,"valid":true,"latitude":12.3456789,"longitude":12.3456789,"altitude":0,"speed":0,"course":0,"address":null,"accuracy":19.23500061035156,"network":null},"device":{"id":1,"attributes":{},"groupId":0,"name":"XXX","uniqueId":"YYY","status":"online","lastUpdate":"2018-10-31T22:14:10.290+0000","positionId":14935,"geofenceIds":[2],"phone":"","model":"","contact":"","category":"person","disabled":false}}


Ich habe ein MQtt device angelegt, da gibts dann das reading position mit diesem string.
Das lifetracking modul reagiert aber nicht darauf. Muss der JSON string anders aussehen?
Wahrscheinlich schon, aber wie? Und wie kriege ich den so hin.

Dank und Gruß

Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

binford6000

Moin Carlos,
aktuell unterstützt livetracking OwnTracks und Swarm. OpenPaths eher nicht mehr (siehe 1. Post).
Und ja, das JSON sieht anders aus. Alternativ könntest Du aber mit expandJSON arbeiten.

VG Sebastian

carlos

Hallo Sebastian,
Schon klar, aber dann habe ich ja auch readings die falsche Namen haben.
Dann muss ich mir ja den JSON String wieder so zusammenbauen wie Opentracks ihn benutzt.
Ich probiere das mal aus.
Könnte man das nicht etwas generischer im modul lösen?
Sprich "lat" und "latitude" gleich behandeln.
Gruß
Carlos
FHEM svn auf Intel NUC mit proxmox,1 UDOO, 3 Raspberry Pi, signalduino, nanoCUL, div. Homematic Komponenten, toom Baumarkt Funksteckdosen, einige sonoffs, hue, shelly

Ma_Bo

Zitat von: carlos am 31 Oktober 2018, 23:20:00
Hallo,
Ich würde das modul gerne mit traccar einsetzen.
Mein Traccar server published folgendes an meinen mosquito:

{"position":{"id":14935,"attributes":{"batteryLevel":61,"distance":0.06,"totalDistance":4132002.73,"motion":false},"deviceId":1,"type":null,"protocol":"osmand","serverTime":"2018-10-31T22:14:10.290+0000","deviceTime":"2018-10-31T22:14:07.000+0000","fixTime":"2018-10-31T22:14:07.000+0000","outdated":false,"valid":true,"latitude":12.3456789,"longitude":12.3456789,"altitude":0,"speed":0,"course":0,"address":null,"accuracy":19.23500061035156,"network":null},"device":{"id":1,"attributes":{},"groupId":0,"name":"XXX","uniqueId":"YYY","status":"online","lastUpdate":"2018-10-31T22:14:10.290+0000","positionId":14935,"geofenceIds":[2],"phone":"","model":"","contact":"","category":"person","disabled":false}}


Ich habe ein MQtt device angelegt, da gibts dann das reading position mit diesem string.
Das lifetracking modul reagiert aber nicht darauf. Muss der JSON string anders aussehen?
Wahrscheinlich schon, aber wie? Und wie kriege ich den so hin.

Dank und Gruß

Carlos


Hey Carlos, ich habe das mit nem HTTPMOD gelöst, somit hole ich alle 30 Sekunden die Daten bei Traccar.

Zitat
defmod Traccar_HTTPMOD HTTPMOD http://DEINEIP:DEINPORT/traccar/rest/getLatestPositions 30
attr Traccar_HTTPMOD userattr sid1URL
attr Traccar_HTTPMOD disable 0
attr Traccar_HTTPMOD enableCookies 1
attr Traccar_HTTPMOD event-on-change-reading .*
attr Traccar_HTTPMOD extractAllJSON 1
attr Traccar_HTTPMOD reAuthRegex Unauthorized
attr Traccar_HTTPMOD room Traccar
attr Traccar_HTTPMOD sid1URL http://DEINEIP:DEINPORT/traccar/rest/login?payload=[DEINTRACCARBENUTZERNAME,DEINTRACCARBENUTZERPASSWORT]
attr Traccar_HTTPMOD verbose 0

Damit bekommst du alle Geräte und deren Daten, die für den Traccar Account sichtbar sind, angezeigt.

Grüße Marcel
NUC mit FHEM, HM Heizungsthermostate, HM Wandthermostate, Intertechno Funksteckdosen, 10" Tablet als Wanddisplay, KeyMatic, Fensterkontakte, Fensterkontakte umgebaut als Wassermelder und Briefkastenmelder, Aussenthermostat, Anwesenheitssteuerung über Fritz Box, Google Home usw. usw.

Markus M.

Zitat von: carlos am 31 Oktober 2018, 23:20:00Ich habe ein MQtt device angelegt, da gibts dann das reading position mit diesem string.
Das lifetracking modul reagiert aber nicht darauf. Muss der JSON string anders aussehen?
Wahrscheinlich schon, aber wie?
Ca. so:
{"tst":1541020442,"acc":65,"_type":"location","alt":123,"lon":10.1234567890,"vac":10,"p":99.1234567890,"lat":50.1234567890,"batt":66,"conn":"m","tid":"MM"}
Beschrieben hier: https://owntracks.org/booklet/tech/json/

ZitatUnd wie kriege ich den so hin.
Indem du statt Traccar OwnTracks verwendest?
Welche Vorteile hat Traccar? Ich sehe irgendwie keine.
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

Jamo

Hallo,
super Modul, ich bin begeistert!
Weiss vielleicht jemand, wie ich aus den livetracking "location" koordinaten, die volle postalische Adresse bekomme?
Danke!
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

Markus M.

FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

Jamo

Hallo Markus,
danke für den Tip, ich habe was mit Openstreetmap gefunden, um die volle Postalische Adresse zu bekommen.
Hier eine Loesung, nicht von mir, sondern aus dem fhem "Blitzer" Modul kopiert und ein wenig verändert:

Sub mit Aufruf:
getBlitzerOrte(ReadingsNum("livetracking","lat",0),ReadingsNum("livetracking","lon",0),"1","livetracking")
Diese sub schreibt die postalische Adresse in 3 readings in das device "livetracking", und zwar als 'Land', 'Ort' und 'Strasse'.
Der trigger fuer die sub ist dann ein notify auf das event livetracking:location:.*

Das ergibt dann folgende Readings:
Strasse Liechtensteinstraße 89
Ort 1090 Wien
Land Österreich


Damit die Sub funktioniert, muss man dann im device "livetracking" die Location mit 2 userreadings in 'lat' und 'lon' aufsplitten:
attr userReadings
lat { my @loc = split(/,/, ReadingsVal("livetracking","location", "0,0")); return $loc[0]; },
lon { my @loc = split(/,/, ReadingsVal("livetracking","location", "0,0")); return $loc[1]; }


Hier die Sub
sub getBlitzerOrte($$$$){
#https://nominatim.openstreetmap.org/search/52.xxxxx%208.xxxx?format=json&addressdetails=1
    my $Poi_lat = shift;
    my $Poi_lng = shift;
    my $num = shift;
    $num = sprintf("%02d", $num);
    my $BlitzerDev = shift;


my $hash = {};
  $hash->{'blitzerdev'} = $BlitzerDev;
$hash->{'num'} = $num;
my $param = {
           #url        => "https://nominatim.openstreetmap.org/search/".$Poi_lat."%20".$Poi_lng."?format=json&addressdetails=1",
   # Die Abfrage von Details erzeugt eine hohe Serverlast und ist nur zum Testen vorgesehen, deswegen URL ohne addressdetails
   url        => "https://nominatim.openstreetmap.org/reverse?format=json&lat=".$Poi_lat."&lon=".$Poi_lng,
           timeout    => 5,
           method     => "GET",            # Lesen von Inhalten
   hash       => $hash,            # Muss gesetzt werden, damit die Callback funktion wieder $hash hat
           header     => "",
           callback   =>  \&getBlitzerOrteCallback   # Diese Funktion soll das Ergebnis dieser HTTP Anfrage bearbeiten
    };
#agent: FHEM/1.0\r\nUser-Agent: FHEM/1.0\r\nAccept: application/json

    HttpUtils_NonblockingGet($param);      # Starten der HTTP Abfrage. Es gibt keinen Return-Code.

}

#Mir ist aufgefallen, dass im Reading "Ort" bei mir immer nur der Ortsteil steht und nicht die dazugehörige Stadt bzw. Gemeinde. Deshalb habe ich in der myUtils die Sub "getBlitzerOrteCallback($)" wie folgt geändert:
sub getBlitzerOrteCallback($) {
    my ($param, $err, $data) = @_;
    my $hash = $param->{hash};
    my $BlitzerDev = $hash->{blitzerdev};
my $num = $hash->{num};

    if($err ne "")      # wenn ein Fehler bei der HTTP Abfrage aufgetreten ist
    {
        Log3 "[getBlitzerOrte]", 3, "error while requesting ".$param->{url}." - $err";   # Eintrag fürs Log
    }
#Log 1,"[getBlitzerOrte] $BlitzerDev ".$param->{data}." ".$param->{url}." ".$param->{httpheader}." ".$param->{code};
#Log 1,"$data";

    #PERL WARNING: "my" variable $Stadtteil masks earlier declaration in same scope at ./FHEM/99_MyUtilsBlitzer.pm line 805.
#PERL WARNING: "my" variable $Stadt masks earlier declaration in same scope at ./FHEM/99_MyUtilsBlitzer.pm line 820.
my $Stadtteil = "";
my $Stadt = "";
my $postcode = ""; #Location
my $road = "";
my $house_number = "";
my $country = "";#Location

my ($Stadtteil) = $data =~ m/city_district":"([^"]+)"/;
        $Stadtteil =~ s/Stadtbezirk....//g;
if ((!defined $Stadtteil) or ($Stadtteil eq "")){
#Log 1, "[getBlitzerOrteCallback] search suburb";
       ($Stadtteil) = $data =~ m/suburb":"([^"]+)"/;
        $Stadtteil =~ s/Stadtbezirk....//g;
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";
    }
if ((!defined $Stadtteil) or ($Stadtteil eq "")){
#Log 1, "[getBlitzerOrteCallback] $Stadtteil";
Log 5, "[getBlitzerOrteCallback] ".$param->{url};
Log 5, "[getBlitzerOrteCallback] $data";
       $Stadtteil = ".";
    }

       my ($Stadt) = $data =~ m/city":"([^"]+)"/;
if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] search village $data";
        ($Stadt) = $data =~ m/town":"([^"]+)"/;
#Log 1, "[getBlitzerOrteCallback] $Stadt";
    }
if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] search village $data";
        ($Stadt) = $data =~ m/village":"([^"]+)"/;
#Log 1, "[getBlitzerOrteCallback] $Stadt";
    }
if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] search village $data";
        ($Stadt) = $data =~ m/state":"([^"]+)"/;
#Log 1, "[getBlitzerOrteCallback] $Stadt";
    }
    if ((!defined $Stadt) or ($Stadt eq "")){
#Log 1, "[getBlitzerOrteCallback] $Stadt";
Log 5, "[getBlitzerOrteCallback] ".$param->{url};
Log 5, "[getBlitzerOrteCallback] $data";
       $Stadt = ".";
    }
    my ($building) = $data =~ m/building":"([^"]+)"/;
    if ((!defined $building) or ($building eq "")){
        $building = ".";
    }
my ($postcode) = $data =~ m/postcode":"([^"]+)"/;
    if ((!defined $postcode) or ($postcode eq "")){
        $postcode = ".";
    }
my ($road) = $data =~ m/road":"([^"]+)"/;
if ((!defined $road) or ($road eq "")){
        ($road) = $data =~ m/path":"([^"]+)"/;
    }
if ((!defined $road) or ($road eq "")){
        ($road) = $data =~ m/neighbourhood":"([^"]+)"/;
    }
if ((!defined $road) or ($road eq "")){
        $road = ".";
    }
my ($house_number) = $data =~ m/house_number":"([^"]+)"/;
    if ((!defined $house_number) or ($house_number eq "")){
        $house_number = ".";
    }
my ($country) = $data =~ m/country":"([^"]+)"/;
    if ((!defined $country) or ($country eq "")){
        $country = ".";
    }
    Log 5,"[getBlitzerOrteCallback] $road $house_number $postcode $Stadt $country $Stadtteil $building ";
    #Log 1,"[getBlitzerOrte] ".$decoded_json->{address}->{suburb}->[0];
if ($Stadt eq "."){$Stadt = " "};
if ($Stadtteil eq "."){$Stadtteil = " "};
      fhem("setreading $BlitzerDev Strasse $road $house_number");
      fhem("setreading $BlitzerDev Ort $postcode $Stadt");
      fhem("setreading $BlitzerDev Land $country");
}


Also anstatt Google, kann man wie in der sub 'getBlitzerOrte', auch Openstreetmap nehmen. Openstreetmap erlaubt eine Rückwärtssuche, einfach mal z.B.
https://nominatim.openstreetmap.org/reverse?format=json&lat=48.2265319824219&lon=16.356583668179,
in den Browser eingegeben, das ergibt folgendes:
{"place_id":"115197608","licence":"Data © OpenStreetMap contributors, ODbL 1.0. https:\/\/osm.org\/copyright","osm_type":"way","osm_id":"170947558","lat":"48.2265974","lon":"16.3563834244286","display_name":"89, Liechtensteinstraße, Thurygrund II, KG Alsergrund, Alsergrund, Vienna, 1090, Austria","address":{"house_number":"89","road":"Liechtensteinstraße","neighbourhood":"Thurygrund II","suburb":"KG Alsergrund","city_district":"Alsergrund","state":"Vienna","postcode":"1090","country":"Austria","country_code":"at"},"boundingbox":["48.2264879","48.2267075","16.3560609","16.3565194"]}
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

Markus M.

Also ca. so? :)

get livetracking address
get livetracking address short
get livetracking address long
get livetracking address 50.1113009,8.6542225


Das Modul ist bei der Gelegenheit auch gleich im regulären Update gelandet.
FHEM dev + HomeBridge + Lenovo Flex15 + HM-CFG-USB + RFXtrx433 + Fritz!Box 7590/7580/546E

HM Aktor/Sensor/Winmatic/Keymatic/Thermostat, HUE, Netatmo Weather/Security/Heating, Xiaomi AirPurifier/Vacuum, Withings Aura/BPM/Cardio/Go/Pulse/Thermo, VSX828, Harmony, Siro ERB15LE
https://paypal.me/mm0

binford6000

Hallo Markus,
echt krasse Reaktionszeit...  :D
Nach reload 98_livetracking.pm und einem Neustart von FHEM erhalte ich das hier:
2018.11.05 03:42:02 3: telnetPort: port 7072 opened
2018.11.05 03:42:02 3: WEB: port 8083 opened
2018.11.05 03:42:03 2: eventTypes: loaded 152 events from ./log/eventTypes.txt
2018.11.05 03:42:03 3: archetype (NOTIFY_archetype) - starting inheritance inheritors
2018.11.05 03:42:03 3: archetype (NOTIFY_archetype) - inheritance inheritors done
2018.11.05 03:42:03 3: archetype (NOTIFY_archetype) - starting inheritance attribute "icon" to inheritors
2018.11.05 03:42:03 3: archetype (NOTIFY_archetype) - inheritance inheritors done
2018.11.05 03:42:03 3: archetype (DOIF_archetype) - starting inheritance inheritors
2018.11.05 03:42:03 3: archetype (DOIF_archetype) - starting inheritance attribute "icon" to inheritors
2018.11.05 03:42:03 3: AptToDate (ncapt) - defined
2018.11.05 03:42:04 1: Including ./log/fhem.save
2018.11.05 03:42:04 1: PERL WARNING: Use of uninitialized value $event in split at ./FHEM/93_RFHEM.pm line 164.
2018.11.05 03:42:04 1: PERL WARNING: Use of uninitialized value in string eq at ./FHEM/93_RFHEM.pm line 166.
2018.11.05 03:42:04 3: Opening mosquitto device 127.0.0.1:1883
2018.11.05 03:42:04 3: mosquitto device opened
2018.11.05 03:42:04 0: Featurelevel: 5.9
2018.11.05 03:42:04 0: Server started with 28 defined entities (fhem.pl:17652/2018-10-31 perl:5.024001 os:linux user:fhem pid:7728)
2018.11.05 03:42:17 1: PERL WARNING: Use of uninitialized value $parameter in pattern match (m//) at ./FHEM/98_livetracking.pm line 247.
2018.11.05 03:42:17 1: PERL WARNING: Use of uninitialized value $parameter in string eq at ./FHEM/98_livetracking.pm line 259.
2018.11.05 03:42:17 1: PERL WARNING: Use of uninitialized value $parameter in string eq at ./FHEM/98_livetracking.pm line 273.
2018.11.05 03:42:17 1: PERL WARNING: Use of uninitialized value $parameter in string eq at ./FHEM/98_livetracking.pm line 274.
2018.11.05 03:42:17 1: PERL WARNING: Use of uninitialized value $parameter in string eq at ./FHEM/98_livetracking.pm line 276.


Wenn ich für meinen aktuellen Standort die Adresse hole, fehlt der Ortsname. Straße, PLZ und Land sind korrekt.
Ich meine auch im o.g. Blitzer Thread gelesen zu haben, dass die Antworten des Open Streetmap Servers unterschiedlich sind,
je nachdem ob man sich in einer Großstadt oder auf dem Land befindet.

VG und gute Nacht,
Sebastian

Jamo

@Markus ja,echt krass! :-)

@Sebastian: In der Tat, die Antworten sind verschieden, deswegen wird beim Blitzer stufenweise der json string auf folgende Matches abgefragt ('city' -> 'town' -> 'village' -> 'state'), sobald z.B 'city' einen Treffer enthält, wird der jason dann nicht mehr auf town, village und state gecheckt(state brauchte ich füer Wien,Österreich).

Stadt: 'city' -> 'town' -> 'village' -> 'state'

Strasse: 'road' -> 'path' -> 'neighbourhood'

Vielleicht kann Markus das ja noch mit einbauen . . .
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack