FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: andipilz am 08 November 2015, 17:16:24

Titel: OwnTracks->MQTT Broker->MQTT_DEVICE->Residents
Beitrag von: andipilz am 08 November 2015, 17:16:24
Hallo!

Irgendwie sitze ich auf dem Schlauch, aber das kommt vor ...

Was ich gerne hätte, ist mit FHEM die "events" von QwnTracks bei betreten oder verlassen von Waypoints auszuwerten, die der Broker an das "abonnierte" MQTT_DEVICE schickt. Damit dann den Zustand der Residents festlegen, ähnlich, wie es Geof(e|a)cy macht. Dort kann ich allerdings keine Waypoints auf das Gerät "pushen", weshalb ich die Lösung mit OwnTracks und MQTT bevorzuge.

Was ich bis dato habe ist

define myMQTT_OT_Event_Andi MQTT_DEVICE
attr myMQTT_OT_Event_Andi IODev myMQTT
attr myMQTT_OT_Event_Andi room Residents
attr myMQTT_OT_Event_Andi stateFormat event
attr myMQTT_OT_Event_Andi subscribeReading_sacher owntracks/ap/sacher/event


Damit bekomme ich die Events in ein Reading mit Namen "sacher":

{"t":"c","tst":1446987969,"acc":5,"_type":"transition","event":"leave","lon":10.92335614376787,"lat":48.02442389079185,"wtst":1446061056,"tid":"AP","desc":"Dahoam"}

Diese liegen dort aber als JSON und ich hätte sie gerne als einzelne Readings, um z.B. auch den Timestamp auswerten zu können, sollten Sie mal nicht "live" reinkommen.

Irgendein Hinweis, wie ich das anstellen soll?

Gruß Andi
Titel: Antw:OwnTracks->MQTT Broker->MQTT_DEVICE->Residents
Beitrag von: stromer-12 am 08 November 2015, 20:09:23
Kannst ja mal folgendes testen, das sollte für jeden Waypoint ein gleichnamiges Reading in deinen Device anlegen. Ich habe das aus meinen notify.

myMQTT_OT_Event_Andi:sacher:.* {
  my $evt     = $EVENT;
  my $data    = substr($evt,index($evt, ": {")+2);
  my $dataset = JSON->new->utf8(0)->decode($data);
  my $place   = $dataset->{desc};
  my $event   = $dataset->{event};
 
  setReadingsVal($defs{$NAME}, $place, $event, FmtDateTime($dataset->{tst}));
}
Titel: Antw:OwnTracks->MQTT Broker->MQTT_DEVICE->Residents
Beitrag von: andipilz am 11 November 2015, 14:05:07
Hallo stromer-12!

Danke, das war der notwendige Knotenlöser.

Alles in allem habe ich es nun so realisiert:
define n_myMQTT_OT_Event notify myMQTT_OT_Event_Andi:sacher:.* { \
  my $evt     = $EVENT;; \
  my $data    = substr($evt,index($evt, ": {")+2);; \
  my $dataset = JSON->new->utf8(0)->decode($data);; \
  my $place   = $dataset->{desc};; \
  my $event   = $dataset->{event};; \
  setReadingsVal($defs{$NAME}, "Transition", $event, FmtDateTime($dataset->{tst}));; \
  setReadingsVal($defs{$NAME}, "Place", $place, FmtDateTime($dataset->{tst}));; \
}

Gruß Andi