knuspermagier.de
Hallo. Ich bins! Philipp!

Konpasu - Dev Log #1

Vor ein paar Monaten, im Laufe der großen Server-Umstellung 2023, programmierte ich ja einige meiner selbstgehosteten Tools um oder neu. Eins davon war Konpasu — meine eigene Implementierung von Compass, dem Backend für den Location-Tracker von Aaron Parecki.

Seit dem Umbau hat sich nicht viel getan, da ich mit den siebenundzwanzig anderen Projekten beschäftigt war, doch so langsam bekam ich die Lust mal wieder etwas daran zu machen und das ganze Ding etwas benutzbarer zu bekommen.

Im Grunde funktionierte das Tool bisher nur sehr rudimentär. Es nahm die Locations von Overland entgegen und speicherte sie. Das Webinterface zeigte alles pur auf einer Leaflet-Karte an, fertig. Ich hatte die alten Daten noch nicht einmal fertig importiert, da einer der großen offenen Punkte war, wie ich damit umgehen will, dass die Daten teilweise ziemlich unsauber sind. Zum Teil gab es ziemlich heftige Ausreißer und wilde Falsch-Trackings. Ich probierte da vor Monaten ewig mit herum, bis ich mir dachte, ich sammle einfach mal weiter und kümmere mich später um die Auswertung.

map_view.png
Hauptansicht mit Karte und Storyline. Natürlich nur Fake-Daten.

Datenreinheit

Vier Monate nach dem letzten Commit hatte ich jetzt immer noch nicht die perfekte Lösung und auch Kalman-Filter, oder wie ich sie hier vernünftig anwenden könnte, um die Punkte zu glätten, immer noch nicht verstanden. Dafür brachte ich die Kraft auf, einfach mit einer nicht so perfekten Lösung zufrieden zu sein.

Meine Lösung sieht nun so aus, dass ich erstmal alle Punkte speichere und ein hidden Flag auf true setze. Alle 15 Minuten läuft ein Cronjob, der sich alle Punkte, die am aktuellen Tag gesammelt wurden, anschaut und entscheidet, welche davon jetzt irgendwie signifikant waren und die anderen bleiben versteckt. So wird das Frontend nicht ultra-überlastet, wenn auf einer Autobahnfahrt 4.000 Datenpunkte gesammelt werden und ich kann Punkte, die komplette Ausreißer sind auch ausfiltern. Letzteres läuft hauptsächlich über eine Plausibilitätsprüfung, was die Geschwindigkeit angeht. Wenn ich mich von einem zum anderen Punkt mit 800 Kilometern in der Stunde bewegt haben soll, ist einer der Punkte wohl Quatsch.

Locations

Ein weiterer Punkt, den ich angehen wollte, war die Storyline. Man eine:r kennt sie vielleicht noch aus Moves. Dort wurde schön zusammengefasst, wo man am Tag so unterwegs war. Zuhause, 30 Min Transport, Büro, 15 Min Walking, Restaurant, etc. Das wollte ich gerne nachbauen. Dafür war es nun mal erstmal wichtig das Konzept von Locations einzubauen.

In der ersten Version sind das jetzt einfach Punkte mit einem Radius, man könnte natürlich auch ein Polygon hinterlegen, um das ganze noch etwas sauberer abzugrenzen, aber so genau müssen wir es ja auch nicht nehmen!

Ich baute also ein, dass man Locations anlegen kann, direkt über die Karte. Da musste ich ein bisschen herumfriemeln um Livewire, Alpine.js und Leaflet zur Zusammenarbeit zu zwingen. Leaflet mag es nämlich zum Beispiel nicht so arg, wenn man Referenzen zur Map und Markern in solchen Proxy-Konstrukten ablegt, wie das die ganzen modernen Frameworks wie Vue.js und auch Alpine.js halt so machen.

Als ich das grundlegend gebaut hatte, baute ich auch gleich noch ein, dass man die Punkte auch auf der Map umherschieben kann, um kaputte Trackings zu korrigieren, nicht, dass man das ernsthaft machen wollen würde, weil so wichtig ist es nunmal auch nicht, aber es geht!

Storyline

Nachdem die Locations drin waren, konnte ich das erkennen der signifikanten Punkte auch nochmal stark verbessern. Alles, was sich im Radius einer Location befand und aufeinander folgte, konnte zusammengefasst werden. Außerdem enthalten die von Overland getrackten Punkte auch den Namen des WLANs, in das man gerade eingeloggt war — dieses konnte ich auch wunderbar nutzen, um Punkte automatisch der Location zuzuordnen, obwohl sie aufgrund von ungenauer Messung eigentlich außerhalb des Radius lagen. So hatte ich nicht mehr 5.000 Messpunkte am Tag, die ein wildes Netz um die Wohnung bauten, sondern halt nur noch einen. Also, wenn ich die Wohnung nicht verlassen habe.

Die Storyline gestaltete sich nun relativ einfach. Ich gehe alle Punkte des Tages durch, und fasse alle Bewegungen zwischen zwei Locations zusammen. Schon hat man eine Moves-ähnliche Darstellung des Tages. Alles nicht so schön genau und schnieke wie damals, aber so halbwegs funktioniert es schon.

Ausblick

Ich bin ganz froh darüber, dass ich an diesem Wochenende etwas Zeit hatte um mich wieder in das Thema reinzudenken. Das ist immer das schwierigste. Mit etwas Glück gelingt es mir nun in den nächsten Tagen noch etwas weiter daran zu basteln, denn ich möchte eigentlich endlich mal die Daten aus Compass importieren, was mir ein paar Jahre mehr Daten einbringen sollte. Danach noch die Daten aus Moves und ich hab wieder eine halbwegs durchgängige Location-Historie seit… 2013 oder so. Zehn Jahre!

Dazu stehen gerade ein paar Kleinigkeiten auf der Todo, wie zum Beispiel, dass ich das Projekt auf den Stand der anderen Projekte bringen sollte. Konpasu war eins der ersten und entspricht noch nicht allen Guidelines, die ich mir für die anderen ausgedacht habe. Vor allem die Dockerfile ist noch etwas doof!

(Eins der Projekte, über die es schwieriger ist zu schreiben, wenn man dafür extra Fake-Daten anlegen muss)

Kommentare, Feedback und andere Anmerkungen?
Schreib mir eine E-Mail 🤓