FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: Masterfunk am 03 Januar 2016, 14:24:57

Titel: Gelöst:Standortanzeige auf Karte
Beitrag von: Masterfunk am 03 Januar 2016, 14:24:57
Hallo,

ist es möglich die Werte aus dem Geofency Modul (currLocLat_xxxx currLocLong_xxxx) zu nutzen und via weblink und (z.B.) Google Maps den aktuellen Standort anzeigen zu lassen?

Gruß Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Loredo am 03 Januar 2016, 14:49:59
https://developers.google.com/maps/documentation/embed/guide
Titel: Antw:Standortanzeige auf Karte
Beitrag von: justme1968 am 03 Januar 2016, 14:54:25
und hier: http://forum.fhem.de/index.php/topic,35121.msg274703.html#msg274703 (http://forum.fhem.de/index.php/topic,35121.msg274703.html#msg274703)
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 03 Januar 2016, 14:59:01
Danke für die Antworten.

Die Frage ist aber eher, wie bekomme ich die dynamischen Werte (aus den Readings) in die URL?

https://www.google.de/maps/@50.7972652,6.0703771,15z?hl=de

Gruß Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 05 Januar 2016, 13:11:07
Steh total auf dem Schlauch.
Hat keiner einen Tip?

Danke und Gruß
Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Loredo am 05 Januar 2016, 13:14:34
http://fhem.de/commandref.html#perl


Zitat
To access the device states/attributes, use the following functions:

       
  • Value(<devicename>)
    returns the state of the device (the string you see in paranthesis in the output of the list command).

  •    
  • OldValue(<devicename>)
  • OldTimestamp(<devicename>)
    returns the old value/timestamp of the device.

  •    
  • ReadingsVal(<devicename>,<reading>,<defaultvalue>)
    Return the reading (the value in the Readings section of "list device")

  •    
  • ReadingsNum(<devicename>,<reading>,<defaultvalue>)
    Return the reading as a number, i.e. delete non-numerical values.

  •    
  • AttrVal(<devicename>,<attribute>,<defaultvalue>)
    Return the attribute of the device

    { Value("wz") }
    { OldValue("wz") }
    { time_str2num(OldTimestamp("wz")) }
    { ReadingsVal("wz", "measured-temp", "20")+0 }
    { ReadingsTimestamp("wz", "measured-temp", 0)}
    { AttrVal("wz", "room", "none") }

  •    
  • InternalVal(<devicename>,<property>,<defaultvalue>)
    Return the internal value (the value in the Internals section of "list device").
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 05 Januar 2016, 22:29:24
Anscheinend bin ich zu blöd dazu.

DEF

link https://www.google.de/maps/@{ReadingsVal("rr_Detlef", "lastLocationLat", "0")},{ReadingsVal("rr_Detlef", "lastLocationLong", "0")},15z?hl=de


Bringt kein Ergebnis.

Gruß Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Baumi am 05 Januar 2016, 23:07:27
Ich weiß nicht, in welchem Zusammenhang Du Deine Definition eingegeben hast, aber generell kann man nicht einfach eine Perl-Funktion mit geschweiften Klammern mitten in eine Zeichenkette packen und dann hoffen, dass dabei etwas Vernünftiges rauskommt.

Falls das link-Attribut(? Falls es ein Attribut ist...), das Du da setzen willst, Perl versteht, kannst Du ihm einen Perl-Block in geschweiften Klammern übergeben, der den Link als Ganzes zurückliefert. (Kleiner Tipp dazu: Verschiedene Zeichenketten lassen sich in Perl mittels . (also dem Punkt) zusammenfügen – auch die Rückgabewerte von Funktionen lassen sich so hineinpacken:

$string1 = "So ge";
$string2 = "ht das! 1234";
print $string1.$string2.sqrt(25);


Das ergibt als Ausgabe: "So geht das! 12345"
(sqrt ist eine Funktion, die die Quadratwurzel liefert, im Falle von 25 also 5.)

Falls das, was Du da setzt hingegen keine Perl-Ausdrücke auswerten kann, könntest Du es per Funktion erledigen. Z.B. über ein Notify auf die Geofancy-Readings. Diese Funktion muss wieder die Zeichenkette zusammenbauen (also den Weblink mit Koordinaten)  und ihn dann als Ganzes in das Attribut schreiben. Wie man das macht, findest Du im Einsteiger-Guide (http://fhem.de/Heimautomatisierung-mit-fhem.pdf).
Titel: Antw:Standortanzeige auf Karte
Beitrag von: justme1968 am 06 Januar 2016, 10:50:02
vielleicht schaust du dir das hier: http://forum.fhem.de/index.php/topic,46665.msg383940.html#msg383940 (http://forum.fhem.de/index.php/topic,46665.msg383940.html#msg383940) ja doch noch mal an...
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 06 Januar 2016, 15:33:58
Zitat von: justme1968 am 06 Januar 2016, 10:50:02
vielleicht schaust du dir das hier: http://forum.fhem.de/index.php/topic,46665.msg383940.html#msg383940 (http://forum.fhem.de/index.php/topic,46665.msg383940.html#msg383940) ja doch noch mal an...

Hab ich heute Morgen mal eben. Scheint auch jetzt zu funktionieren. ;-)
Muss nur noch etwas Feintuning machen.
Ich werde berichten.

Danke und Gruß
Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 06 Januar 2016, 20:49:05
Soweit läuft es jetzt. Danke noch mal für die leichten Schläge auf den Hinterkopf. ;-)

Habe es wie folgt gelöst:

in die myUtils:
sub ShowGoogleMapsPosition($$$) {
my ($zoom,$width,$height,$lat,$lng) = @_;
$zoom='12' unless $zoom;
$width='740' unless $width;
$height='470' unless $height;
$lat= ReadingsVal ("rr_Detlef", "locationLat", "0");
$lng= ReadingsVal ("rr_Detlef", "locationLong", "0");

  my $htmlcode = "";
 
  $htmlcode .= "<script src='https://maps.googleapis.com/maps/api/js?v=3.exp'></script>";
  $htmlcode .= "<script>";
  $htmlcode .= "function initialize() {  ";
  $htmlcode .= "var myLatlng = new google.maps.LatLng(".$lat.",".$lng.");  ";
  $htmlcode .= "var mapOptions = {    ";
  $htmlcode .= "  zoom: ".$zoom.",    ";
  $htmlcode .= "  center: myLatlng  ";
  $htmlcode .= "};  ";
  $htmlcode .= "var map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);  ";
  $htmlcode .= "}";
  $htmlcode .= "google.maps.event.addDomListener(window, 'load', initialize);    ";
  $htmlcode .= "</script>    ";
  $htmlcode .= "<div id='map-canvas' style='width:".$width."px;height:".$height."px;'></div>";
 
  return $htmlcode;
}


Und dann folgende Definition:


htmlCode {ShowGoogleMapsPosition(17,400,300)}


Mein Standort wird auch schön mittig auf der Karte angezeigt.
Nun scheutere ich daran genau da eine Stecknadel anzuzeigen.
Werde aus der API Beschreibung nicht schlau.
Kann noch mal jemand auf den Kopf hauen?

Danke und Gruß
Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Baumi am 07 Januar 2016, 09:22:49
Schön, dass es klappt.

Hilft das hier (https://developers.google.com/maps/documentation/javascript/examples/marker-simple) weiter?
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 07 Januar 2016, 10:04:51
Zitat von: Baumi am 07 Januar 2016, 09:22:49
Schön, dass es klappt.

Hilft das hier (https://developers.google.com/maps/documentation/javascript/examples/marker-simple) weiter?

Genau damit "kämpfe" ich im Moment. :-(

Gruß Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Baumi am 07 Januar 2016, 15:56:08
Hast Du Dir das Beispiel unter "Javascript + HTML" auf der Seite angesehen? Daran solltest Du Dich eigentlich orientieren können.
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 07 Januar 2016, 18:14:52
Ja, hab mir das nageschaut:

https://developers.google.com/maps/documentation/javascript/

Und dann diesen Code erstellt:

sub ShowGoogleMapsPosition($$$) {
my ($zoom,$width,$height,$lat,$lng) = @_;
$zoom='12' unless $zoom;
$width='740' unless $width;
$height='470' unless $height;
$lat= ReadingsVal ("rr_Detlef", "locationLat", "0");
$lng= ReadingsVal ("rr_Detlef", "locationLong", "0");

  my $htmlcode = "";
 
  $htmlcode .= "<script src='https://maps.googleapis.com/maps/api/js?v=3.exp'></script>";
  $htmlcode .= "<script>";
  $htmlcode .= "function initialize() {  ";
  $htmlcode .= "var myLatlng = new google.maps.LatLng(".$lat.",".$lng.");  ";
  $htmlcode .= "var mapOptions = {    ";
  $htmlcode .= "  zoom: ".$zoom.",    ";
  $htmlcode .= "  center: myLatlng  ";
  $htmlcode .= "};  ";
  #$htmlcode .= "var markerOptions = {    ";
  #$htmlcode .= "  map: map    ";
  #$htmlcode .= "  zoom: ".$zoom.",    ";
  #$htmlcode .= "  position: myLatlng  ";
  #$htmlcode .= "  title: Detlef  ";
  #$htmlcode .= "};  "; 
  $htmlcode .= "var map = new google.maps.Map(document.getElementById('map'), mapOptions);  ";
  $htmlcode .= "}";
  #$htmlcode .= "var marker = new google.maps.Marker( markerOptions);  ";
  #$htmlcode .= "}";
  $htmlcode .= "google.maps.event.addDomListener(window, 'load', initialize);    ";
  $htmlcode .= "</script>    ";
  $htmlcode .= "<div id='map' style='width:".$width."px;height:".$height."px;'></div>";
 
  return $htmlcode;
}


Die auskommentierten Zeilen ist das was zusätzlich hinzu gekommen ist.
Wenn ich diese aber aktiv habe, bekomme ich gar keine Anzeige.

Ich weiß warum ich programieren hasse. Solange es eine Hipath 4000 oder ein Cisco UCM ist gehts noch, aber dann...

Gruß Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Papaloewe am 07 Januar 2016, 19:05:24
Ich bin auch kein Programmierer, aber denke, dass bei dir zwei "geschweifte Klammern auf" fehlen,
oder zwei "geschweifte Klammern zu" zuviel sind.

$htmlcode .= "var map = new google.maps.Map(document.getElementById('map'), mapOptions);  ";
$htmlcode .= "}";
$htmlcode .= "var marker = new google.maps.Marker( markerOptions);  ";
$htmlcode .= "}";
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 07 Januar 2016, 19:27:47
Hab alle vermeintlich möglichen Konstellationen getestet.
Kein Erfolg. :-(

Gruß Detlef
Titel: Antw:Standortanzeige auf Karte
Beitrag von: Masterfunk am 07 Januar 2016, 21:57:27
Es geht!

Hier der funktionierende Code für die Mytils:

sub ShowGoogleMapsPosition($$$) {
my ($zoom,$width,$height,$lat,$lng) = @_;
$zoom='12' unless $zoom;
$width='740' unless $width;
$height='470' unless $height;
$lat= ReadingsVal ("rr_Detlef", "locationLat", "0");
$lng= ReadingsVal ("rr_Detlef", "locationLong", "0");

  my $htmlcode = "";

  $htmlcode .= "<script src='https://maps.googleapis.com/maps/api/js?v=3.exp'></script>";
  $htmlcode .= "<script>";
  $htmlcode .= "function initialize() {  ";
  $htmlcode .= "var myLatlng = new google.maps.LatLng(".$lat.",".$lng.");  ";
  $htmlcode .= "var mapOptions = {    ";
  $htmlcode .= "  zoom: ".$zoom.",    ";
  $htmlcode .= "  center: myLatlng  ";
  $htmlcode .= "};  ";
  $htmlcode .= "var map = new google.maps.Map(document.getElementById('map'), mapOptions);  ";
  $htmlcode .= "var marker = new google.maps.Marker({ ";
  $htmlcode .= "  position: myLatlng, ";
  $htmlcode .= "  title: 'Detlef', ";
  $htmlcode .= "}); ";
  $htmlcode .= "marker.setMap(map); ";
  $htmlcode .= "} ";
  $htmlcode .= "google.maps.event.addDomListener(window, 'load', initialize);    ";
  $htmlcode .= "</script>    ";
  $htmlcode .= "<div id='map' style='width:".$width."px;height:".$height."px;'></div>";
 
  return $htmlcode;
}


Einzig der "Titel" wird nicht angezeigt. Schaun mer mal... Da fehlte ein Komma. (Im Code korrigiert)

Gruß Detlef
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Masterfunk am 07 Januar 2016, 22:38:45
Hab noch den "Resident" als Variable eingebaut, damit man nicht für jeden eine eigene Sub in der MyUtuls anlegen muss.

Definition des weblink:


htmlCode {ShowGoogleMapsPosition(17,400,300,"rr_Detlef")}


MyUtils:

sub ShowGoogleMapsPosition($$$$) {
my ($zoom,$width,$height,$Resident) = @_;
$zoom='12' unless $zoom;
$width='740' unless $width;
$height='470' unless $height;
$lat= ReadingsVal ($Resident, "locationLat", "0");
$lng= ReadingsVal ($Resident, "locationLong", "0");

  my $htmlcode = "";

  $htmlcode .= "<script src='https://maps.googleapis.com/maps/api/js?v=3.exp'></script>";
  $htmlcode .= "<script>";
  $htmlcode .= "function initialize() {  ";
  $htmlcode .= "var myLatlng = new google.maps.LatLng(".$lat.",".$lng.");  ";
  $htmlcode .= "var mapOptions = {    ";
  $htmlcode .= "  zoom: ".$zoom.",    ";
  $htmlcode .= "  center: myLatlng  ";
  $htmlcode .= "};  ";
  $htmlcode .= "var map = new google.maps.Map(document.getElementById('map'), mapOptions);  ";
  $htmlcode .= "var marker = new google.maps.Marker({ ";
  $htmlcode .= "  position: myLatlng, ";
  $htmlcode .= "  title: 'Detlef', ";
  $htmlcode .= "}); ";
  $htmlcode .= "marker.setMap(map); ";
  $htmlcode .= "} ";
  $htmlcode .= "google.maps.event.addDomListener(window, 'load', initialize);    ";
  $htmlcode .= "</script>    ";
  $htmlcode .= "<div id='map' style='width:".$width."px;height:".$height."px;'></div>";
 
  return $htmlcode;
}


Gruß Detlef
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Baumi am 08 Januar 2016, 00:21:11
ZitatIch weiß warum ich programieren hasse. Solange es eine Hipath 4000 oder ein Cisco UCM ist gehts noch, aber dann...

Javascript wird aber auch von vielen Programmierern gehasst. ;)

Der Grund dafür, dass Du keine Fehlermeldungen gesehen hast, ist übrigens, dass die Browser die in einem Extra-Bereich verstecken, der Javascript-Konsole. Wo die zu finden ist, ist leider bei jedem Browser etwas anders, aber via Google müsstest Du das eigentlich auch für den Browser finden, den Du benutzt. Da hättest Du nämlich bei den "Der Bildschirm ist weiß"-Fehlern höchstwahrscheinlich Meldungen lesen können, die Dich schneller auf die richtige Spur gebracht hätten. (Ähnlich den Fehlern, die FHEM ausgibt, wenn ma es mit einer fehlerhaften MyUtils-Datei füttert.)
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Masterfunk am 12 Januar 2016, 08:04:38
Wo Du es sagst...

...da hab ich schlichtweg nicht dran gedacht. Wie ich die Konsole starte ist mir klar, aber ob es mir was genützt hätte... ;-=

Gruß Detlef
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Loredo am 17 Januar 2016, 17:39:01
Bei der Nutzung mit ROOMMATE oder GUEST gibt es in diesen Devices ab morgen einen neuen Setter "create locationMap", welcher ein entsprechendes Weblink Device anlegt (nutzt dafür die Google Maps Embed API). Das kann man hinterher nach belieben abändern.




Gruß
Julian
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Masterfunk am 17 Januar 2016, 21:08:30
Ja das hättest Du auch mal früher machen können.  ;) ;D

Gruß Detlef
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Loredo am 17 Januar 2016, 21:24:43
alles so wie man Zeit hat  ;)
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Hermann am 31 Januar 2016, 15:28:51
Hallo,
Zitat von: Loredo am 17 Januar 2016, 17:39:01
Bei der Nutzung mit ROOMMATE oder GUEST gibt es in diesen Devices ab morgen einen neuen Setter "create locationMap", welcher ein entsprechendes Weblink Device anlegt (nutzt dafür die Google Maps Embed API). Das kann man hinterher nach belieben abändern.

Hallo, gibt es "create locationMap" noch ? Bei mir wird es aktuell nicht angeboten. Stand 31.01.16, fhem per update aktuell.

Hermann
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Loredo am 31 Januar 2016, 15:32:56
Gibt es. Wird aber nur angeboten, wenn die location Readings existieren. Ansonsten gibt es ja auch nix zum anzeigen ;-)
Man muss also erstmal ein Location Event generieren.
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Hermann am 31 Januar 2016, 15:40:49
Danke für die schnelle Antwort. Ich steh aber trotzdem auf dem Schlauch.
Ich dachte wenn bei  geofency folgende readings angezeigt werden reicht es ?

lastLocLat_Hermann
lastLocLong_Hermann

Die Variablen sind bei mir gefüllt. Verstehe ich etwas falsch ?

Hermann
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Loredo am 31 Januar 2016, 16:28:43
Das Feature ist ein ROOMMATE Feature, keines für GEOFANCY.
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Hermann am 31 Januar 2016, 16:48:43
Hallo,

Danke das Du nicht aufgibst. Das war mir schon klar das das zu roommate gehört. Lese ja die commandref über roommate rauf und runter :-(

"locationMap   add a pre-configured weblink device using showing a Google Map if readings locationLat+locationLong are present."

Ich hab bei roommate in der fhem config folgendens gesetzt: attr rr_Hermann rr_locationHome home

Leider immer nich keine locationLat....

Hermann
Titel: Antw:Gelöst:Standortanzeige auf Karte
Beitrag von: Loredo am 31 Januar 2016, 16:51:14
du musst beim ROOMMATE Device in das Attribut rr_geofenceUUIDs die UUID deines mobilen Gerätes eintragen. Wie die ID lautet, steht bei einkommenden Events im GEOFANCY Device (dort steht was mit "... dev:87676-875-8756 ...". Die Nummer dahinter ist die UUID, die du im ROOMMATE Device eintragen musst, um ROOMMATE und GEOFANCY miteinander zu verknüpfen.