OwnTracks->MQTT Broker->MQTT_DEVICE->Residents

Begonnen von andipilz, 08 November 2015, 17:16:24

Vorheriges Thema - Nächstes Thema

andipilz

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

stromer-12

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}));
}
FHEM (SVN) auf RPi1B mit HMser | ESPLink
FHEM (SVN) virtuell mit HMLAN | HMUSB | CUL

andipilz

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