TA2k / ioBroker.withings

ioBroker adapter for Withings
MIT License
5 stars 4 forks source link

creates tenthousands objects and states with withings.sleep #9

Open Grizzelbee opened 2 years ago

Grizzelbee commented 2 years ago

Had the adapter V0.0.6/V0.0.7 running for four month now with a single Nokia sleep (aka Withings Sleep Analyzer). In that time the adapter created about 1.200 new objects and states per night. This resulted in approx 150.000 objects and states as of today.

After deletion of the adapter and cleanup I had only: 19.172 objects and 17.005 states left.

I think the adapter needs a housekeeping routine or a general concept overhaul to avoid that. Especially since not all of these objects are accessable in the object tree.

TA2k commented 2 years ago

Can you provide a screenshot of the folder

Grizzelbee commented 2 years ago

Hmmm. Difficult! Since I deleted everything to find this issue. And trying to restore the backup in my development environment destroyed the dev environment. So I'll keep trying but can't promise.

Edit: Maybe I can extract the objects and states from the backup files directly. Would this be sufficient too?

Edit II: Just took a look into the data by iob list objects and realized that most states are written by:

So in the end: running the adapter for approx. 120 nights with approx 1.400 states per night it would sum up to 168.000 states. Thats pretty close to what I'm facing.

Since I configured to retrieve the last 30 days I expected older values to be deleted. But in fact it dosen't seem to be the case. I think it's not a good idea to use the objects and states file as a database for historization. It would be much better to clean up every day and retrieve only the last night and drop historic values to the database as it's ment to be. Or (even better) only provide the values that are delivered every day (like average values, durations (Minutes of snoring), ...). Since the datapoints change every day it's anyway not possible to use them in senseful way. Another solution may be to create states like:

TA2k commented 2 years ago

can you try the github version. Should now be sorted and series01 should have the most recent object

Damrak2022 commented 2 years ago

Das ist bei mir genauso, dass unfassbar viele Objekte angelegt werden. Ich habe jetzt die neue Github-Version geladen und meinen ganzen Verzeichnisbaum von Withings gelöscht, um neu zu werden. Im Allgemeinen möchte ich meine Schlafdaten (mindestens 1 Jahr) ja über einen langen Zeitraum über Influx und Grafana darstellen. Wie sollte ich dann den Abruf bei dem Withings Adapter optimal einstellen? Damm müsste ja der Abruf 1 Tag und 24 Stunden im Schlaf reichen, da die Daten dann in der Influx sind, oder? ch werde beobachten wie schnell sich ab heute wieder Objekte ansammeln.

Grizzelbee commented 2 years ago

@TA2k : What is your preferred language mon github? German or english?

I tested the github version over night and Objects increased by ~540 and states by ~1500. If this still happens every night (and I expect that) it will soon be unusable. Btw: grafik

You create states for HR, RR, ... with a current value (I'm assuming). Are the state names (-> red rectangle) timestamps? If so - it's pretty impossible to write these values to a database to analyze/visulize them using grafana, float, VIS, ... , since it's impossible to react to constantly changing state names. In the end: You can't do anything with these data.

I think - what we really need here is a structure like:

sleep
+- hr
    +-- Heartrate              50 bpm
    +-- hr-timestamp       1555855520 (but as a readable timestamp please)
+- rr
    +-- r-rate                  12 
    +-- rr-timestamp       1555855520
+- snoring
...

And this structure needs to be updated with every value the API delivers (also if someone chooses to poll last xx nights from the API). And only the newest value stays in the object tree. Every older value needs to be stored in the database. That's the only way it makes sense. All the "seriesXX" stuff doesn't make any sense to me - it's not loggable.

TA2k commented 2 years ago

Danke für den Screenshot ich habs jetzt glaube verstanden bitte alles unter sleep löschen und nochmal via github installieren

Wieviele timestamps kommen denn pro serie eintrag? Ich gehe zur zeit von einem aus

Grizzelbee commented 2 years ago

Jetzt steht unter sleep praktisch nichts mehr (hatte den kompletten Baum gelöscht und nur das wurde neu angelegt). grafik

In dem Zusammenhang ist mir auch aufgefallen, das das oben gesagte quasi genauso für die sleepSummary gilt. Für meinen Geschmack könnte man das zusammen legen.

Einheiten wären auch noch ein super Gewinn. Bei vielen Zahlen weiß man einfach nicht, wie man die interpretieren soll. deepSleepDuration zum Beispiel. Sind das Sekunden, Minuten, ...?

Wie wird bei dem Adapter eigentlich die morgentliche Aktualisierung getriggert?

TA2k commented 2 years ago

Gibt es im log errors?

in der api finde ich dazu nichts zur aktualisierung https://developer.withings.com/api-reference#operation/heartv2-get

Grizzelbee commented 2 years ago

Gibt es im log errors?

Nein. Keine Fehler - Zumindest nicht gerade. Das ist das gesammte current-log:

root@ganymed:~# cat /opt/iobroker/log/iobroker.2022-06-22.log | grep withings
2022-06-22 00:31:20.325  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 00:31:20.338  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 00:31:20.456  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 00:31:20.457  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 03:31:20.311  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 03:31:20.313  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 03:31:20.420  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 03:31:20.420  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 06:31:20.293  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 06:31:20.297  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 06:31:20.408  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 06:31:20.409  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 09:31:20.305  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 09:31:20.308  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 09:31:20.431  - error: withings.0 (2368559) https://wbsapi.withings.net/v2/sleep
2022-06-22 09:31:20.431  - error: withings.0 (2368559) TypeError: Cannot read property 'sort' of undefined
2022-06-22 11:58:40.054  - info: host.ganymed "system.adapter.withings.0" disabled
2022-06-22 11:58:40.060  - info: host.ganymed stopInstance system.adapter.withings.0 (force=false, process=true)
2022-06-22 11:58:40.126  - info: withings.0 (2368559) Got terminate signal TERMINATE_YOURSELF
2022-06-22 11:58:40.133  - info: withings.0 (2368559) terminating
2022-06-22 11:58:40.134  - info: withings.0 (2368559) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
2022-06-22 11:58:40.153  - info: host.ganymed stopInstance system.adapter.withings.0 send kill signal
2022-06-22 11:58:40.706  - info: host.ganymed instance system.adapter.withings.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION)
2022-06-22 11:59:43.829  - info: host.ganymed iobroker url TA2k/ioBroker.withings --host ganymed
2022-06-22 11:59:44.568  - info: host.ganymed iobroker install TA2k/ioBroker.withings
2022-06-22 11:59:44.749  - info: host.ganymed iobroker Installing TA2k/ioBroker.withings... (System call)
2022-06-22 12:04:14.966  - info: host.ganymed iobroker + iobroker.withings@0.0.7updated 1 package in 269.797s
2022-06-22 12:04:15.575  - info: host.ganymed iobroker upload [3] withings.admin /opt/iobroker/node_modules/iobroker.withings/admin/index_m.html index_m.html text/html
2022-06-22 12:04:15.617  - info: host.ganymed iobroker upload [2] withings.admin /opt/iobroker/node_modules/iobroker.withings/admin/style.css style.css text/css
2022-06-22 12:04:15.622  - info: host.ganymed iobroker upload [1] withings.admin /opt/iobroker/node_modules/iobroker.withings/admin/withings.png withings.png image/png
2022-06-22 12:04:15.626  - info: host.ganymed iobroker upload [0] withings.admin /opt/iobroker/node_modules/iobroker.withings/admin/words.js words.js application/javascript
2022-06-22 12:04:15.661  - info: host.ganymed iobroker Update "system.adapter.withings.0"
2022-06-22 12:16:18.282  - info: host.ganymed "system.adapter.withings.0" enabled
2022-06-22 12:16:18.406  - info: host.ganymed instance system.adapter.withings.0 started with pid 196616
2022-06-22 12:16:19.541  - info: withings.0 (196616) starting. Version 0.0.7 (non-npm: TA2k/ioBroker.withings) in /opt/iobroker/node_modules/iobroker.withings, node: v14.19.3, js-controller: 4.0.23
2022-06-22 12:30:09.822  - info: host.ganymed "system.adapter.withings.0" disabled
2022-06-22 12:30:09.824  - info: host.ganymed stopInstance system.adapter.withings.0 (force=false, process=true)
2022-06-22 12:30:09.829  - info: withings.0 (196616) Got terminate signal TERMINATE_YOURSELF
2022-06-22 12:30:09.830  - info: withings.0 (196616) terminating
2022-06-22 12:30:09.832  - info: withings.0 (196616) Terminated (ADAPTER_REQUESTED_TERMINATION): Without reason
2022-06-22 12:30:09.839  - info: host.ganymed stopInstance system.adapter.withings.0 send kill signal
2022-06-22 12:30:10.436  - info: host.ganymed instance system.adapter.withings.0 terminated with code 11 (ADAPTER_REQUESTED_TERMINATION)
2022-06-22 12:30:11.421  - info: host.ganymed "system.adapter.withings.0" enabled
2022-06-22 12:30:11.624  - info: host.ganymed instance system.adapter.withings.0 started with pid 228319
2022-06-22 12:30:12.803  - info: withings.0 (228319) starting. Version 0.0.7 (non-npm: TA2k/ioBroker.withings) in /opt/iobroker/node_modules/iobroker.withings, node: v14.19.3, js-controller: 4.0.23

in der api finde ich dazu nichts zur aktualisierung

Das meinte ich auch nicht. Holt der Adapter sebständig Zeitgesteuert neue Daten, oder schickt die API die von sich aus? Wenn ich so ins Log schaue sieht das wie ein 3 Stunden Poll-Intervall aus.

TA2k commented 2 years ago

nochmal installieren es wird wie in den optionen im minuten interval abgefragt

Grizzelbee commented 2 years ago

Es wird immer spannender: ;) grafik

Damrak2022 commented 2 years ago

Loggst Du die Daten unter Sleep? Ich nehme die von Sleep Summarys/Data/Series01

Mit freundlichen Grüßen

Andreas Wahn

Bitte denken Sie an unsere Umwelt und ob es notwendig ist diese Email auszudrucken.

Mit What3Words finden Sie jede Adresse punktgenau:

https://w3w.co/teppiche.pflegen.angelegt

Mörfelder Landstraße 210

60598 Frankfurt

Tel: +49 69 872 00 878 Mobil: +49 157 3963 4367

Am 22. Juni 2022, 16:09 +0200 schrieb Grizzelbee @.***>:

Es wird immer spannender: ;) — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you commented.Message ID: @.***>

Grizzelbee commented 2 years ago

@Damrak2022 Naja. Beide sind interessant und ergeben nur zusammen das ganze Bild. Die Summary bietet die Zusammenfassung der Nacht. Das ist schon einmal super. Da fehlen mir im Grunde nur ein paar Einheiten zum besseren Verständnis.

grafik

Nimm mal den Puls (rotes Rechteck). In der Summary siehst du Min, Max und Durchschnitt. Wenn Du aber zum Beispiel den Verlauf über die ganze Nacht analysieren musst, brauchst Du die Daten aus Sleep, weil Du dort das Tupel TimeStamp/Puls hast. Und nur damit kannst Du die Pulskurve über die ganze Nacht zeichnen.

Deshalb sage ich ja das wir die Daten aus SleepSummary brauchen und zusatzlich:

Das ganze SeriesXX-Gedöns ist nach meinem Dafürhalten unnötig und bringt keinen Mehrwert. Zumal ich irgendwie das System noch nicht durchschaut habe. Series01 scheint immer die letzte Nacht zu sein - was über die Zeit betrachtet, dazu führt, dass sich unter sleep-series01-data-hr (und den anderen: rr, snoring) unendlich viele States ansammeln, weil sich die IDs nie wiederholen (können, da timestamps). Dadurch können sie aber auch nicht in einer DB erfasst werden.

TA2k commented 2 years ago

nochmal probieren

Damrak2022 commented 2 years ago

Ich erfasse die Daten seit heute wieder mit Influx. Allerdings habe ich mich noch nie mit den Daten aus Sleep auseinandergesetzt. Es wäre natürlich super, wenn das alles sehr gut loggen könnte um es dann in Grafana darzustellen. Mir wäre der Rückblick auf die letzten 6 Monate, oder noch besser 1 Jahr wichtig. Auf der anderen Seite dürfen natürlich die Objekte nicht so massiv ansteigen, das irgendwann wiederherstellen über 100000 Objekte vorhanden sind. Aber insgesamt fehlt mir da nochveine Menge an Hintergrundwissen. Auf jeden Fall bin ich dankbar, das es diesen Adapter gibt und er jetzt vielleicht optimiert werden kann.

Mit freundlichen Grüßen

Andreas Wahn

Bitte denken Sie an unsere Umwelt und ob es notwendig ist diese Email auszudrucken.

Mit What3Words finden Sie jede Adresse punktgenau:

https://w3w.co/teppiche.pflegen.angelegt

Mörfelder Landstraße 210

60598 Frankfurt

Tel: +49 69 872 00 878 Mobil: +49 157 3963 4367

Am 22. Juni 2022, 16:51 +0200 schrieb Grizzelbee @.***>:

@Damrak2022 Naja. Beide sind interessant und ergeben nur zusammen das ganze Bild. Die Summary bietet die Zusammenfassung der Nacht. Das ist schon einmal super. Da fehlen mir im Grunde nur ein paar Einheiten zum besseren Verständnis. Nimm mal den Puls (rotes Rechteck). In der Summary siehst du Min, Max und Durchschnitt. Wenn Du aber zum Beispiel den Verlauf über die ganze Nacht analysieren musst, brauchst Du die Daten aus Sleep, weil Du dort das Tupel TimeStamp/Puls hast. Und nur damit kannst Du die Pulskurve über die ganze Nacht zeichnen. Deshalb sage ich ja das wir die Daten aus SleepSummary brauchen und zusatzlich:

• RR+Timestamp, • HR+Timestamp • Snoring+Timestamp, • StartDate • EndDate

Das ganze SeriesXX-Gedöns ist nach meinem Dafürhalten unnötig und bringt keinen Mehrwert. Zumal ich irgendwie das System noch nicht durchschaut habe. Series01 scheint immer die letzte Nacht zu sein - was über die Zeit betrachtet, dazu führt, dass sich unter sleep-series01-data-hr (und den anderen: rr, snoring) unendlich viele States ansammeln, weil sich die IDs nie wiederholen (können, da timestamps). Dadurch können sie aber auch nicht in einer DB erfasst werden. — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

Grizzelbee commented 2 years ago

@TA2k Wir bewegen uns in die richtige Richtung: grafik

Aber jetzt fehlt noch der TimeStamp zu hr, rr und snoring. Die Daten ergeben nur zusammen Sinn. Deshalb ja meine Idee SLEEP und die SeriesXX komplett in Rente zu schicken und SleepSummary um die oben genannten Felder zu erweitern. Dann ergibt sich ein komplettes Bild einer Nacht - und baut sich über die Zeit vernünftig in der DB auf. Das einzige Problem sind dann nur noch die historischen Daten. Die würde ich über einen Button im Config holen und scheiben lassen. Sodass man nach der Installation des Adapters die DB-Konfig für die Historisierung machen kann und dann einmalig auf Button-Klick die historischen Daten reinladen. Eine Automatik halte ich für zu kompliziert.

TA2k commented 2 years ago

Ich habe noch was angepasst

Damrak2022 commented 2 years ago
Screenshot-3

Timeinbed-1 Timeinbed-2 IMG_798C68680FA4-1 IMG_B3F9681C848A-1

Guten Morgen,

Ich habe jetzt nochmal eine Frage: Könntest Du den Wert von total_sleep_time unter sleep summary’s wieder auf den Minuten, bzw. Sekunden Wert abändern? Dann wäre nämlich das Logging einfacher und vor allem die Weiterverarbeitung in Grafana. Weiterhin verstehe ich die Daten noch nicht so ganz. In der App wird mir für die heutige Nacht eine Schlafenszeit von 1 Std. 30 min angezeigt, aber in den Objekten ein Wert von 2Std.30 min Auch bei den anderen ersten gibt es Abweichungen. Zur Verdeutlichung habe ich Dir mal einen Screenshot aus der App, sowie von den Datenpunkten angehängt. Weiterhin ist mir nicht klar wie ich z.B den Wert total_timeinbed umrechnen soll um einen korrekten Minutenwert zu erhalten. Der Wert in den Datenpunkten ist 7980. Laut App war ich genau 2 Std. 13min im Bett - siehe Screenshots. Dies trifft auch auf einige andere Werte zu. Generell möchte ich auf jeden Fall folgende Datenpunkte loggen und in Grafana visualisieren - siehe Screenshot 3 Ich hoffe, ich habe mich halbwegs verständlich und nachvollziehbar ausgedrückt.

Am 22. Juni 2022, 18:38 +0200 schrieb TA2k @.***>:

Ich habe noch was angepasst — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

Damrak2022 commented 2 years ago

Mir ist gerade aufgefallen das bei Activities 01 und Activities 02 die absolut identischen Daten drinstehen. Kann Du das korrigieren, oder soll ich hier bei Abruf der Daten den Wert von 1 auf 0 ändern? Weiterhin würde ich mich auf eine Antwort von meinem vorigen Post freuen, da die Daten nicht synchron mit der App sind und ich auch gerne wüsste wie ich die Werte korrekt umrechne.

Bildschirmfoto 2022-06-25 um 03 54 10 Bildschirmfoto 2022-06-25 um 03 54 33 Bildschirmfoto 2022-06-25 um 03 56 55

Gruß Andy

TA2k commented 2 years ago

Ich habe keine Ahnung es werden nur die Daten aus der API weitergeleitet. Außerdem fehlt mir die Zeit für tiefgreifende Änderung der Daten aber der Adapter ist offen jeder kann alles verändern

ev3info commented 2 years ago

Hallo zusammen, erstmal danke für den Adapter.

Ich habe das Problem, das nach ca. einer Woche meine DB zu viele Datapoints hat und extrem langsam wird. Im Prinzip fängt das ganze System an in die Knie zu gehen.

Der Grund ist der sleep-Ordner im Adapter. Die Anzahl der Datenpunkt steigt hier täglich an. Ich habe die aktuelle Version 0.0.9 wo das Problem eigentlich gelöst sein sollte.

Meine Frage wäre, kannst du in den Adapter eine delete-Funktion einbauen? Es würde reichen, wenn ich einstellen kann, jeden Tag 12 Uhr den sleep-Ordner löschen. Aktuell mache ich das per Hand.

Grüße Tobi

TA2k commented 2 years ago

Kannst du bitte via GitHub installieren und schauen ob damit dein Problem gelöst ist

ev3info commented 2 years ago

Kannst du bitte via GitHub installieren und schauen ob damit dein Problem gelöst ist

Ja mach ich. Ich melde mich dann nochmal.

ev3info commented 2 years ago

Kannst du bitte via GitHub installieren und schauen ob damit dein Problem gelöst ist

Ja mach ich. Ich melde mich dann nochmal.

Ich hab alles mit der Github-Version laufen lassen. Versionsnummer ist 0.0.10.

Ich hatte Initial 2876 Objekte (4 Instanzen) nach einem Tag sind es jetzt 3435. Ich melde mich später nochmal. Vielleicht steigt es ja nicht weiter.

ev3info commented 2 years ago

Kannst du bitte via GitHub installieren und schauen ob damit dein Problem gelöst ist

Ja mach ich. Ich melde mich dann nochmal.

Ich hab alles mit der Github-Version laufen lassen. Versionsnummer ist 0.0.10.

Ich hatte Initial 2876 Objekte (4 Instanzen) nach einem Tag sind es jetzt 3435. Ich melde mich später nochmal. Vielleicht steigt es ja nicht weiter.

Super ist stabil. Danke dir für den Tipp mit dem Github-Update.