Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FIT: adding fit support, adding gc integration, using memcache, addin… #1

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

sjeri
Copy link
Owner

@sjeri sjeri commented Feb 26, 2021

…g HRM support

@sjeri
Copy link
Owner Author

sjeri commented Feb 26, 2021

@inonoob see here ;)

@sjeri
Copy link
Owner Author

sjeri commented Feb 26, 2021

kleinere Fehler gilt es noch auszumerzen...

@inonoob
Copy link
Collaborator

inonoob commented Feb 26, 2021

Sieht auf jeden Fall geil aus. Muss ich testen. Sehe ich das richtig das ant+ HRM immer an ist ? Bzw nur geht wenn antfe aktiviert wird?

@sjeri
Copy link
Owner Author

sjeri commented Feb 26, 2021

ja, ich hatte das da mit dran gehangen. Aber es muss kein Gerät auf die FE Daten hören. D.h. es kann auch nur der Brustgurt registriert sein und die HRM Daten sind verfügbar.
Problematisch wäre nur, wenn mehrere HRM Quellen gleichzeitig da wären... Das habe ich nicht gelöst.

@inonoob
Copy link
Collaborator

inonoob commented Feb 26, 2021

Meinst du sowas wie ein. Paar macht zusammen Sport und dein eine waterrower der ander Laufband und beide haben ant+ HRM dann würde pirowflo beide sehen ?

@sjeri
Copy link
Owner Author

sjeri commented Feb 26, 2021

Möglich. Bin mir da nicht sicher. Ich hab hier mehrere Ant+ HRM Sensoren. Ich probiere das mal aus sobald ich die Fehler die noch drin sind raus habe. Aktuell gibt es noch kleine Schwierigkeiten mit dem erkennen des Ruderers und mit den Daten die von Garmin gezogen werden.

@inonoob
Copy link
Collaborator

inonoob commented Feb 26, 2021

Hey sach Mal memcache ersetzt dass queue ? Bzw ich das damit man Sachen Zeichen Threads teilen kann. Ich hatte zu der Zeit nichts besseres gefunden und verstanden :)

@sjeri
Copy link
Owner Author

sjeri commented Feb 26, 2021

Memcached ist quasi nen caching server.
Kann man nutzen um zwischen verschiedenen Threads, Prozessen, Programmen oder auch Servern Daten auszutauschen.
Ich hab das hier genommen um es mal auszuprobieren. Kenne das sonst nur von anderen Projekten peripher..
Erst wollte ich queues nutzen wie du. Dann fiel mir die schiere Zahl an queues auf mit teilweise identischen Daten.
Dann kam mit der Gedanke, dass es ja nett wäre auf dem OLED auch Daten anzuzeigen und da das als eigener Service, also nicht im selben Prozess läuft, dann halt über einen Abschnitt hiervon zu arbeiten: https://docs.python.org/3/library/multiprocessing.html

Das wurde dann aber recht kompliziert... Und pymemcached liefert quasi alles was ich mir vorgestellt hatte. Inklusive expiry. Muss halt nur installiert und gestartet werden.

Aber ließe sich natürlich auch über queues machen... Also alles bis auf die OLED Darstellung...

@inonoob
Copy link
Collaborator

inonoob commented Feb 26, 2021

Oo Ohh geil genau dass was ich mal gesucht hatte. Besonders der Teil mit dem teilen über Thread Grenzen.

Heisst zu einem späteren Zeitpunkt würden wir von Queue wegkommen zu Memcached ! Richtig nice !! Ich hatte nämlich auch gesucht wie man die Daten aus PiRowFlo auf dem OLED bekommt. Beispiel die Kraftkurve vom SmartRow :)

@sjeri
Copy link
Owner Author

sjeri commented Feb 26, 2021

Ich kann dir nur leider nicht sage wie performant das ist. Sollte nicht allzu viel Verzögerung sein.
Ich habe aber auch eine Messagetime mit reingenommen für die FIT Daten.
Letztlich sind im Memcache aber alles einzelne Felder, die unabhängig voneinander sind. Kein gesamtrecord.
Ich speichere sie zwar zeitgleich zusammen (set_many()) aber es sind trotzdem alle Dict Werte einzeln. Durch set_many ist es nur performanter.
Abrufen tue ich über get_many dann genau die, die ich auch brauche.

@inonoob inonoob marked this pull request as ready for review March 1, 2021 19:56
@inonoob
Copy link
Collaborator

inonoob commented Mar 1, 2021

Hey,
So habe dein code jetzt auf mein Pi laufen. Kann es sein das der HRM nicht die daten über BLE sendet ? Bzw. die HRM daten nicht an BLE thread weitergegeben wird ?

@sjeri
Copy link
Owner Author

sjeri commented Mar 1, 2021

Stimmt, das hatte ich noch nicht gemacht. Aktuell landet es nur im FIT und ant selber.
Ich hab am WE einiges geändert und noch viele meiner Fehler behoben (z.b. dass der ble reset von coxwain am ende dafür sorgt, dass die Daten gelöscht werden vorm hochladen nach garmin). Bin aber heute und morgen zeitlich nicht in der Lage. Mittwoch früh lade ich den neuen Code hoch ;)
Bist du noch über etwas gestolpert?

@inonoob
Copy link
Collaborator

inonoob commented Mar 1, 2021

Das Wochenende war mehr Kids betreuen als progren :). Also ich würde dann Mittwoch warten was dein neuer Code zeigt.
Ich wollte anfangen die Daten von HRM Daten in BLE zu überführen. Aber ich warte lieber. War mir nur aufgefallen dass bei Coxswain er bei der Einstellung HRM from Waterrower nichts angezeigt hatte :)

@sjeri
Copy link
Owner Author

sjeri commented Mar 1, 2021

Ja, hier war auch action^^
Klingt gut. Stimmt... in coxswain hätte ich nur mal auf hrm über ble stellen müssen. Probier ich aus.
In meinem ersten draft wollte ich den BLE Part nicht auch noch anfassen. Aber wenn die hrm Daten da rein sollen, dann muss ich wohl :)

@inonoob
Copy link
Collaborator

inonoob commented Mar 2, 2021

Hey,

klingt gut ich hätte glaub ich wieder mit dem queue gearbeitet also aus waterrowerant hätte ich ant_q_out definiert und genommen und diese dann in waterrowerble übergeben. Wie würdest du das machen mit memecache ?

Grüße

@inonoob
Copy link
Collaborator

inonoob commented Mar 2, 2021

Eine Sachen noch, hattest du bei Antdongle gesehen dass für ANT-FE selbst wenn du denn HRM wert angiebst, dann muss auch noch die Flag dazu stimmen:

Capabilities = 0x34 # IN_USE | HRM | Distance | Speed
# # bit 7.... ...0
# HRM = 0b00000011 # 0b____ __xx bits 0-1 0 = hand contact sensor (2020-12-28 Unclear why option chosen)
# Distance = 0b00000000 # 0b____ _x__ bit 2 1 = No distance in byte 3 (2020-12-28 Unclear why option chosen)
# VirtualSpeedFlag = 0b00000000 # 0b____ x___ bit 3 0 = Real speed in byte 4/5 (2020-12-28 Could be virtual speed)
# FEstate = 0b00110000 # 0b_xxx ____ bits 4-6 3 = IN USE
# LapToggleBit = 0b00000000 # 0bx___ ____ bit 7 0 = No lap toggle

HRM =               0b00000000  # 0b____ __xx bits 0-1 0 = (Default) Invalid. The source of the heart rate data is unknown/other.    (2020-12-28 Unclear why option chosen)
11 3 The source of the heart rate data is hand contact sensors on the FE.
10 2 The source of the heart rate data is an EM (5 kHz) heart rate monitor.
01 1 The source of the heart rate data is an ANT+ heart rate monitor.
00 0 (Default) Invalid. The source of the heart rate data is unknown/other.

Im moment ist der bei PiRowFlo auf 00 gesetzt also : The source of the heart rate data is unknown/other.

Frage hattest du gesehen ob über ANT+ jetzt HRM mitübertragen wird. Ich muss heute Abend das prüfen. Wenn nicht muss noch je nachdem ob HRM benutzt wird der Flag wert Capabilities angepasst werden.

Capabilities = 0x34 # IN_USE | HRM | Distance | Speed

0x34 falls kein HRM benutzt wird und 0x11 das so aussieht als kommt es direkt von der Maschine.

Doku nr. wo du das nachlesen kannst: ant-device-profile-fitness-equipment-rev-50-6.pdf Kapitel 8.5.2.6.
Ich kann leider das nicht hier hochladen wegen Copyright ANT+.

@sjeri
Copy link
Owner Author

sjeri commented Mar 2, 2021

Hey,

klingt gut ich hätte glaub ich wieder mit dem queue gearbeitet also aus waterrowerant hätte ich ant_q_out definiert und genommen und diese dann in waterrowerble übergeben. Wie würdest du das machen mit memecache ?

Grüße

Hi, da würde ich es machen wie im FitFileService. Client starten und wenn präsent und HRM gesetzt, dann holen und in den Values ersetzen. Hab das lokal schon eingebaut. Leider grad keine Zeit zum testen.
Aber über queues ginge es natürlich auch.

Frage hattest du gesehen ob über ANT+ jetzt HRM mitübertragen wird. Ich muss heute Abend das prüfen. Wenn nicht muss noch je nachdem ob HRM benutzt wird der Flag wert Capabilities angepasst werden.

Das habe ich derbe übersehen. Ich bin der Meinung es wird eine HR angezeigt (wenn du das testen kannst wäre super, denn vielleicht war es auch meine Uhr selber?)... Aber das zu setzen macht definitiv Sinn.

In meinem push morgen früh ist auch ein Beispiel von meinem Oled code drin.
Bin allgemein gespannt was du über das Memcache Zeug denkst. Gehen tut ja beides (memcache oder queues).

Generell wäre noch das Thema copyrights. Da bin ich nicht so drin... Z.B. der Code von Fortius.

@inonoob
Copy link
Collaborator

inonoob commented Mar 2, 2021

Hey, jo ich werden mich Mal in diese memcache einlesen mach vieleicht Sinn später die andern thread umzuziehen.

Ich teste heute Abend das mit dem flag. Ich hatte mir ein User dort sehr lange debugt damit seine Uhr das HRM Signal des Handgelenk Sensors nimmt. Als ich das nicht auf 00 stehe hatte war HRM immer 0. Aber jetzt wo wir das mit senden wollen muss der Wert sich ändern.

Zu dem Copyright Ding. Ich habe das Projekt jetzt GPL 3.0 gemacht damit wir den Code nehmen können.

Was ich meinte war der Copyright von ant+ Dokumenten bzw. die specification. Um die zu bekommen muss man sich bei ant+ anmelden. ... Ist das Internet und Wetter nicht toll da findet man sehr viel.... Aus diesem Grund kann ich dir die Spec nicht einfach senden bzw. hier hochladen.

@sjeri
Copy link
Owner Author

sjeri commented Mar 3, 2021

so, hab mal geupdated.
Ob das mit den AntFE Daten klappt bezüglich der HR kann ich dir leider nicht sagen... Meine Uhr unterstützt das nur marginal und versucht dann immer die Werte vom eigenen Sensor oder dem Brustgurt direkt zu nehmen... Merkwürdig alles.
Ich würde aber meinen es müsste auch so gehen. Warum sonst hat FortiusAnt das so gesetzt?

lg

@inonoob
Copy link
Collaborator

inonoob commented Mar 4, 2021

Hey sorry das ich dein Code noch nicht gestest habe ich bin im Moment an dieser Doppel Bluetooth Sache dran wo man gleichzeitig Bluetooth für normale Apps + smartrow app zur gleichen Zeit verwenden kann. Hatte gestern nach Tagen endlich ein Durchbruch. Smartrow app redet endlich mit pirowflo.

inonoob#26

@sjeri
Copy link
Owner Author

sjeri commented Mar 4, 2021

Ja, kein Problem, hab ich gesehen. Finde ich super und wäre toll wenn es zusammen funktioniert.
Also kein Stress. Hab selber beruflich kaum Zeit aktuell ;)

@inonoob
Copy link
Collaborator

inonoob commented Mar 4, 2021

Ja dat blöde ich bin bestimmt schon seit mehreren Wochen dran mehrer Anläufe gehabt aber gestern hatte ich endlich so 3 Letzt Strohhalm Idee gestest und die Letzte war es doch am ende.... Die bluez Entwickler haben das python Beispiel ble.py nicht vollständig nach API specification programmiert. Da musst du erstmal drauf kommen !!!

@inonoob
Copy link
Collaborator

inonoob commented Mar 5, 2021

Also ich dachte ich dreh durch gestern, Gestern ging das nicht mehr mit dem dual gatt bluetooth server. Heute habe ich endlich herausgefunden warum !!!
Der Pi lauft per Default mit Bluetooth Classic und LE-only. Ich habe jetzt herausgefunden dass Android am besten funktioniert wenn man den GATT Server verwendet, dass nur LE-only eingestellt sein sollte. Wat ein kampf !!

@inonoob
Copy link
Collaborator

inonoob commented Mar 11, 2021

Oki, so ich will die Tage dein Code nochmal testen und dann in PiRowFlo mergen.

@inonoob
Copy link
Collaborator

inonoob commented Mar 11, 2021

vielleicht interessant. Um Bluetooth Verbindungen stabiler und besser zu machen, muss ich in der nächsten Version bluez von Source compilieren bzw. davor noch im Source Code was ändern.
Ich muss bluez so einstellen dass, nur bluetooth LE verwendet wird. Damit habe ich nochmal eine Vielzahl an Problem behoben bekommen.

@sjeri
Copy link
Owner Author

sjeri commented Mar 12, 2021

hey,
bin selber unter Wasser im Moment.
Mit bluez klingt merkwürdig. Ich dachte man könnte da einfach den Pfad anpassen und dann geht das. Aber da hast du mehr Ahnung, ich bin nicht im Thema.

Was meinen Code angeht, ich überlege einfach mal alles von Queues auf memcache umzustellen. Um zu sehen wie das dann läuft...

Am WE will ich aber erstmal mein oled2 Skript aufboren, damit es auch das Auswählen eines Userprofiles unterstützt. Ausserdem wollte ich noch nen pop-up bei Statusänderungen einbauen. Geht ja dann mit memcache ganz prima dank message expiry.

Sobald das alles geht können meine Kids dann auch ohne mich aufs Ergo. Nur den Härtegrad vom FlowRow Board muss ich dann noch händisch für sie ändern falls nötig...

@inonoob
Copy link
Collaborator

inonoob commented Mar 12, 2021

Hehehe loool mit dem FLowRo board. Ich wollte mal Fragen ob das board echt was bringt, Aber für 250€ puuu teuer. Ist genau so teuer wie 1 smartrow :)

Ja wegen bluez ist voll komisch aber leider ist das so nach mehreren Tagen sogar Wochen Recherche ... Die sache ist du kannst in der /etc/bluetooth/main.conf sagen du willst nur bluetooth LE aber dann wird nur der letzte bluetooth dongle in der reihe also fast immer der Interne bluetooth des Pi auf bluetooth LE umgestellt. Die anderen Bluetooth Dongles bleiben bei Bluetooth Classic und Bluetooth LE. Ich habe mal bei Bluez ein issue aufgemacht aber bis jetzt kein feedback.

Wenn du alles auf memcache änderst, würde es auch mein Problem mit dem Dual GATT lösen. Ich kann nur 2 GATT Server am laufen kriegen wenn ich diese nicht im gleichen Python Script laufen lasse. Aber das geht nur wenn ich die Daten aus dem ersten Prozess in den zweiten bekomme. Und so wie ich dich verstanden habe geht das nur mit memcache.

@sjeri
Copy link
Owner Author

sjeri commented Mar 15, 2021

Das FlowRow Board ist schon nice. Mir hatte im Lockdown die Bootsstabilität im Einer gefehlt.. Ist so wieder etwas präsenter. Auch gut für die Muskulatur bezüglich der Seitenstabilität ;)

Ich hab grad alles auf Memcache umgebaut. Funktioniert eigentlich, aber ich bekomme keine Werte mehr per BLE... Es ist als ob der Callback nur einmal kommt und dann nie wieder. Sehr merkwürdig. Sehe nicht woran es liegt.
Woanders kommen die Daten an. Ggf ein Timing Problem?
Ich sehe, dass einmal "no data from s4 interface" geloggt wird und danach nie wieder. Was übersehe ich... Falls du eine Idee hast...

@sjeri
Copy link
Owner Author

sjeri commented Mar 15, 2021

ok... mein Fehler.. hatte den SR erst nach der Coxswain App gestartet... So herum geht es nicht... Aber auch nervig.
Ich nutze die App fast nie und hätte eigentlich erst mein Workout vorbereitet und dann den Rower gestartet. Nunja... jedenfalls geht es jetzt auf Basis von Memcache... Ich hoffe auch stabil. Eine 1h Session mache ich dann morgen früh um es mal zu testen.

@inonoob
Copy link
Collaborator

inonoob commented Mar 15, 2021

Frage: ist das PiRowFlo nicht egal ob danach oder davor ? Das reset wird doch von coxswain immer wieder gesendet wenn du ein neues Training startest. Müsstest also immer Daten haben.

@inonoob
Copy link
Collaborator

inonoob commented Mar 15, 2021

aber geile Sache dass, du alles auf memecache umgebaut hast. Ich muss heute das bluez install script fertigstellen. Dann check if deine änderung und würde diese gern ins Haupt PiRowFlo mergen.

@sjeri
Copy link
Owner Author

sjeri commented Mar 15, 2021

Ja, hätte ich auch erwartet, aber ging irgendwie nicht. Probier es lieber selber auch nochmal ordentlich aus. Nicht, dass ich nen Cornercase übersehen habe.
Der Hauptunterschied jetzt: Aus queues holst du den Wert und er ist weg. In memcache bleibt der bis zum expire des Wertes drin (oder bis er ersetzt wurde durch einen neuen. D.h. könnte auch noch einige weitere Male geholt werden. Bisher hab ich daran keinen Nachteil gesehen, aber wie gesagt, schau du ruhig auch mal ob das Schwierigkeiten macht ;)

@inonoob
Copy link
Collaborator

inonoob commented Mar 15, 2021

Hey wenn die Kids schlaffen. Hoffe ich den Test für bluez fertig zu bekommen dann kann ich mich drum Thema widmen.

@inonoob
Copy link
Collaborator

inonoob commented Mar 15, 2021

Da kommen mir die ersten Frage:

warum benutzt du 127.0.0.1 also localhost und nicht den UNIX socket ? https://github.com/nicmcd/uds_vs_tcp
hast du in der /etc/memcached.conf was geändert oder default gelassen ?

Grüße

ps: ich lese mich gerade in memecached etwas ein :)

@sjeri
Copy link
Owner Author

sjeri commented Mar 15, 2021

Guter punkt, hatte ich nicht erwägt. Aber sollte einfach sein. Probier ich morgen aus

@inonoob
Copy link
Collaborator

inonoob commented Mar 15, 2021

Hey,

ist das ein bug oder ich verstehe es nicht:

'force', 'watts_avg', 'pace_avg', 'HRM_Rate'))
mt = WaterrowerValuesRaw.pop('message_time', None)
if len(WaterrowerValuesRaw.keys()) > 0 and mt and mt != self.last_message_time:
self.last_message_time = mt
hrm = WaterrowerValuesRaw.get('HRM_Rate', 0)
if hrm > 0:
WaterrowerValuesRaw['heart_rate'] = hrm

müsste es nicht 'HRM_Rate' sein und nicht 'heart_rate' oder ich verstehe es noch nicht

@sjeri
Copy link
Owner Author

sjeri commented Mar 16, 2021

heart_rate ist der Wert den du vom SR oder S4 schickst. HRM_Rate der Wert den ich von Ant+ setze. Der code überschreibt also den von SR oder S4 generierten HR Wert, falls der HRM Wert größer 0 ist.
Geht bestimmt auch eleganter oder schon an der Quelle...

@sjeri
Copy link
Owner Author

sjeri commented Mar 16, 2021

so, war doch etwas komplizierter mit dem socket... ^^
Läuft nun aber bei mir. Auch mein Oled2 Skript zeigt weiter die Werte an.
Daran bastel ich dann weiter heute abend.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants