Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Withings Daten einlesen

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Withings Daten einlesen

    This topic has been deleted. Only users with topic management privileges can see it.
    • P
      pix last edited by

      Hallo,
      @uwered:

      Moin Pix.

      Ich habe ne Withings-Bodyscale Waage im Einsatz.

      Wenngleich ich auch nichts davon halte meine Körperdaten durch das Netz zu pusten, bietet die Waage aber 2 Sensoren die mich reizen …

      Einmal die Temperatur des Raumes und den CO² Gehalt der Luft.

      Bei Gelegenheit wollte ich das mal an Dein Script "dranprokeln", die Datenblöcke sind ja in der API von Nokia gut dargestellt ...

      Was ich partout nicht finden kann, ist der Batterie-Level des Devices ...

      Gruss

      Uwe `
      habe den Post wohl damals übersehen. 😮

      Ich habe derzeit Probleme mit der Verbindung zu Nokia/Withings. Es kommen schon einige Wochen keine Daten mehr rein. Ist das bei Euch auch so? Ich finde aber keinze Zeit, mich ums Problem zu kümmern.

      Wenn ich mal wieder Zeit finde, dann will ich das Skript nochmal etwas optimieren. Geräte, die nicht in meinem Besitz sind, lassen sich natürlich nur schwer einpflegen. Ich werde mal sehen, was geht.

      Ein ganzer Adapter kommt derzeit nicht in Frage. Ich habe noch Altlasten von den anderen Adaptern zu beseitigen (Upgrade auf admin3… :roll: ).

      @uwered:

      Hallo Pix.

      Einen kleinen Bug habe ich gefunden.

      Und Zwar bei der Umrechnung vom epoc-Datum ins "normale" Datum beim Gewicht.

      Im Script steht :
      > setState('Withings.Gewicht.Datum', new Date(gewicht_epoc)); // Datum wird umgewandelt
      Da müsste aber

      " setState('Withings.Gewicht.Datum', new Date(gewicht_epoc *1000)); // Datum wird umgewandelt "

      stehen, damit es klappt.

      Gruss `

      Schau mir das an, vielen Dank für den Hinweis!

      Gruß

      Pix

      1 Reply Last reply Reply Quote 0
      • B
        Balu1973 last edited by

        Hallo Zusammen,

        ich würde gerne auch meine Withings/Nokia Daten in iobroker benutzen.

        Ich habe mich über den link im ersten Post angemeldet und habe API key und API secret erhalten.

        Bei den oauth access token, oauth access token secret und user ID tue ich mich schwer. Ist das auf der Webseite die User Authorization?

        Wenn ich da auf genehmigen gehe, kommt nur was "Rechtsvereinbarungen - sie werden weitergeleitet", aber es passiert nichts.

        Das Script im ersten Post ist aber so schon noch gültig/aktuell?

        Funktioniert es denn generell bei jemanden? Es scheint ja auf Nokia Seite Änderungen/Einschränkungen zu geben… Lohnt es sich hier weiterzuschauen (wobei ich von Scripten und APIs leider so gut wie keine Ahnung habe...)?

        Danke und Grüße,

        Balu

        1 Reply Last reply Reply Quote 0
        • S
          stimezo Forum Testing last edited by

          Hallo Balu,

          habe mich eben selber angemeldet. Die leere Seite mit den Rechtsvereinbarungen habe ich auch.

          Ist aber egal 🙂 da du nur die UserID aus diesem Step benötigst und die findest Du im link in der

          Browser Adressleiste.

          Viele Grüße

          Christian

          1 Reply Last reply Reply Quote 0
          • B
            Balu1973 last edited by

            Hallo Christian,

            prima, Danke. Ich habe auch noch mal geforscht:

            Es gibt eine Seite von Nokia auf der man alles mögliche an Tokens erzeugen kann:

            https://developer.health.nokia.com/api

            Nach dem letzten Schritt bekomme ich auch meine Werte angezeigt bekomme. Aber wenn ich alle keys und IDs im Script eingetragen habe kommen dort trotzdem keine Werte.

            Klappt das Script bei Dir?

            Danke und Grüße,

            Balu

            1 Reply Last reply Reply Quote 0
            • S
              stoffel67 last edited by

              Hallo,

              habe auch eine kurze Frage dazu,

              ich bekomme meine Daten als JSON geliefert (passt soweit) , aber wie bekomme ich die Daten von "Familienangehörigen", in der IOS/APP habe ich

              weitere Familien/Mitglieder.

              Wie komme ich an die weitere USERID?

              1 Reply Last reply Reply Quote 0
              • ruhr70
                ruhr70 last edited by

                @stoffel67:

                ich bekomme meine Daten als JSON geliefert (passt soweit) , aber wie bekomme ich die Daten von "Familienangehörigen", in der IOS/APP habe ich

                weitere Familien/Mitglieder.

                Wie komme ich an die weitere USERID? `

                Sind die im JSON schon enthalten?

                1 Reply Last reply Reply Quote 0
                • P
                  pix last edited by

                  Hallo,

                  wenn ich das richtig sehe, dann müsstest du dich mit der ID des Familienmitglieds genauso bei https://developer.health.nokia.com/ anmelden und dir die Schlüssel holen. Ein zweites Script wär da angebracht.

                  :idea: Ich arbeite gerade an einem neuen Skript. Es sollte eigentlich etwas leichter als das alte werden und basiert zur Zeit noch auf diesem npm-Modul https://github.com/tellnes/withings-request/

                  Allerdings versteht das Modul nur Gewicht, Blutdruck, Puls (wenn mit Blutdruck gemessen) und Temperatur. Schritte und andere Aktivitäten habe ich noch nicht rausbekommen. Mal sehen, ob ich das noch schaffe.

                  Auf jedenfall gibt es auch immer nur die Werte zu einer UserID, also einer Person.

                  Ich würde gern auch noch die Pushfunktion von nokia einbauen (wenn Ereignisse eintreten, dann Nachricht an ioBroker), dazu ist dann die Cloud nötig (IFTTT Anbindung). Hat da jemand schon Erfahrungen?

                  Gruß

                  Pix

                  1 Reply Last reply Reply Quote 0
                  • B
                    Balu1973 last edited by

                    Es kommt wohl drauf an. Bei mir sind die Familienmitglieder im gleichen Konto.

                    Ich habe mich mit diesem ganz normal am Health Dashboard per Browser angemeldet. Dort kann man ja dann auch die Mitglieder auswählen und deren Daten anschauen. In der Adressleiste kann man dann die weitere UserID sehen. Zwei Scripte würde das aber auch bedeuten.

                    Wenn jeder sein ganz eigenes Konto hat muss eben für jedes ein API Key usw. erstellt werden.

                    Grüße,

                    Balu

                    1 Reply Last reply Reply Quote 0
                    • S
                      stoffel67 last edited by

                      > Ich habe mich mit diesem ganz normal am Health Dashboard per Browser angemeldet. Dort kann man ja dann auch die Mitglieder auswählen und deren Daten anschauen. In der Adressleiste kann man dann die weitere UserID sehen
                      Super, da sieht man die userid

                      Vielen Dank

                      1 Reply Last reply Reply Quote 0
                      • ruhr70
                        ruhr70 last edited by

                        @pix:

                        er als das alte werden und basiert zur Zeit noch auf diesem npm-Modul https://github.com/tellnes/withings-request/

                        Allerdings versteht das Modul nur Gewicht, Blutdruck, Puls (wenn mit Blutdruck gemessen) und Temperatur. Schritte und andere Aktivitäten habe ich noch nicht rausbekommen. Mal sehen, ob ich das noch schaffe.

                        Auf jedenfall gibt es auch immer nur die Werte zu einer UserID, also einer Person. `

                        Na da freue ich mich jetzt schon 🙂

                        Hoffentlich übersehe ich nicht, wenn Du das veröffentlichst. :mrgreen:

                        @pix:

                        Ich würde gern auch noch die Pushfunktion von nokia einbauen (wenn Ereignisse eintreten, dann Nachricht an ioBroker), dazu ist dann die Cloud nötig (IFTTT Anbindung). Hat da jemand schon Erfahrungen? `

                        Ich bin mir nicht ganz sicher, was Du meinst.

                        Momentan lass ich das Gewicht per IFTTT und Cloud-Adapter an ioBroker übertragn und ncoh nicht mit Deinem Skript. Da warte ich auf Deine neue Version.

                        Wenn eine Messung durchgeführt wurde (IFTT if withings), dann übertrage es per Post (IFTTT then Webhook) an iobroker. bei den unterschiedlichen Weebhooks kommt dann vor dem Inhalt immer ein Kennwort, so dass ein Skript die Kennungen auswertet und entsprechend reagiert.

                        Meintest Du das oder noch was anderes mit IFTTT?

                        1 Reply Last reply Reply Quote 0
                        • P
                          pix last edited by

                          Hallo,

                          ja, es gibt in WithingsNokia Ereignisse (zB Schrittziel erreicht). Wenn diese eintreten, kann Withings einen Webhook senden. SimpleApI ist aber nicht von außen erreichbar, aber Cloud über ifttt. Das meine ich.

                          Pix

                          1 Reply Last reply Reply Quote 0
                          • P
                            pix last edited by

                            Naja, ist dann vielleicht doch zu aufwendig. Ich will ja keine neue App programmieren :lol:

                            https://developer.health.nokia.com/api/ … tification

                            1 Reply Last reply Reply Quote 0
                            • D
                              dtp last edited by

                              Wir haben uns zwei Nokia Sleep besorgt und ich würde die gerne in ioBroker einbinden. Wir haben zwar auch noch eine Withings Body Personenwaage und das Blutdruckmessgerät, aber deren Daten brauche ich eher nicht im ioBroker. Spannend ist aber - wie ich finde - das Auslösen bestimmter Ereignisse in Abhängigkeit des Nokia Sleep. Geht zwar auch über IFTTT, aber ich würde das per ioBroker bevorzugen.

                              API Key und Secret habe ich mir bereits erzeugt. Nun stehe ich aber ein wenig auf dem Schlauch, wie ich an https://developer.health.nokia.com/api weiter machen muss.

                              1 Reply Last reply Reply Quote 0
                              • S
                                stoffel67 last edited by

                                das ist doch hier beschrieben:

                                https://developer.health.nokia.com/api/doc

                                Measure - Get Sleep Measures

                                für die Notifikation , einfach ein "callback" anlegen, ..dazu brauchts dann aber einen eigenen "Web-Service". da nur Port 80 oder 443

                                von Nokia verwendet werden

                                Notification - Create Notification

                                Notification - Notification callback

                                das Ganze per http-request abschicken…

                                hab (noch) kein Nokia Sleep aber mit meiner Waage funktioniert's prima...

                                1 Reply Last reply Reply Quote 0
                                • D
                                  dtp last edited by

                                  @stoffel67:

                                  für die Notifikation , einfach ein "callback" anlegen, ..dazu brauchts dann aber einen eigenen "Web-Service". da nur Port 80 oder 443

                                  von Nokia verwendet werden `

                                  Sorry, aber das ist mir als Nicht-Programmierer einfach zu abstrakt. Wäre ja schön, wenn mal jemand eine Schritt-für-Schritt-Anleitung posten könnte. Aber irgendwie scheinen Informatiker da auf einem anderen Level unterwegs zu sein. 8-)

                                  pix schreibt zum Beispiel in seinem Ausgangsposting:

                                  @pix:

                                  Natürlich braucht man erstmal ein Withings Nutzer Konto. https://oauth.withings.com/partner/add. Das ist nötig, um an die Daten zu kommen. Wenn man das geschafft hat und erfolgreich einen Consumer Key, einen consumer secret, ein oauth access token, einen oauth access token secret und die user id erhalten hat, dann kann man folgendes Skript nutzen. `
                                  Aber wie zum Henker komme ich an die notwendigen oauth-Daten ran? Das ist zwar https://developer.health.nokia.com/api beschrieben, aber ich weiß trotzdem nicht, was ich dort in den Feldern im Detail einzutragen habe.

                                  Nun ja, wahrscheinlich bin ich da als Elektrotechniker und Patentreferent einfach zu weit weg. Oder ich bin mit meinen 50 Jahren zu alt. :roll:

                                  1 Reply Last reply Reply Quote 0
                                  • S
                                    stoffel67 last edited by

                                    nicht so schnelle aufgeben… 😉

                                    ich bin 58 und Maschinenbauer 8-), und ich habs auch geschafft...

                                    hast du mal diese vier Steps durchgeführt:(geht online)

                                    https://developer.health.nokia.com/api#step1

                                    kopiere dir das Ergebnis immer in eine Textdatei… sind immer lange "Tokens"

                                    im ersten Step "Step1" gibst du mal deine zwei Tokens ein (API key und secret)

                                    dann "Generate..) drücken, es wird ein ein http-string unterhalb des schwarzen log-Fensters angezeigt,

                                    dann darauf drücken > Result (click to perform request) :

                                    und du erhälst im Browser den "oauth_token" und "oauth_token_secret"

                                    dann Step2 …

                                    übrigens gute Idee...
                                    > wenn mal jemand eine Schritt-für-Schritt-Anleitung posten könnte
                                    fallt dann dabei direkt ab…. 😄

                                    1 Reply Last reply Reply Quote 0
                                    • D
                                      dtp last edited by

                                      Nun ja, mein Problem fängt schon bei Step 1 an.

                                      996_2018-05-16_16h53_56.png
                                      Woher nehme ich den Consumer Key und den Consumer Secret und was trage ich als Callback URL ein? Wenn ich Schritt 1 überstanden habe, ist der Rest quasi ein Selbstläufer. 😉

                                      1 Reply Last reply Reply Quote 0
                                      • ruhr70
                                        ruhr70 last edited by

                                        @dtp:

                                        Woher nehme ich den Consumer Key und den Consumer Secret und was trage ich als Callback URL ein? Wenn ich Schritt 1 überstanden habe, ist der Rest quasi ein Selbstläufer. 😉 `

                                        Scrolle mal auf der Seite nach ganz oben. Da findest Du in der Beschreibung einen Link, unter dem Du dann Deinen Developer Account anlegen kannst.

                                        327_nokia.png

                                        1 Reply Last reply Reply Quote 0
                                        • ruhr70
                                          ruhr70 last edited by

                                          und Callback lässt Du leer

                                          1 Reply Last reply Reply Quote 0
                                          • ruhr70
                                            ruhr70 last edited by

                                            Bei mir hat das Skript aus Post 1 keine Daten abgerufen.

                                            Ich habe deswegen mit einem komplett neuen Skript begonnen.

                                            Die Variante liest jetzt erst einmal alle Körperwerte ein (Waage) und legt die Datenpunkte automatisch an.

                                            Falls es jemand testen möchte:

                                            ! ```
                                            `var logOn = true; // true: zusätzliche Ausgaben im ioBroker Log
                                            ! var consumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                                            consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                                            oauth_access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                                            oauth_access_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                                            userid = "xxxxxx";
                                            ! var pfad = "Withings" + "."; // Pfad, in dem neue Datenpunkte angelegt werden sollen
                                            ! var subPfadKörperwerte = "Körperwerte"; // Unterordner, in dem die Köperwerte angelegt werden
                                            ! var historyEin = true; // true: automatisch History beim Anlegen der Datenpunkte konfigurieren
                                            var historyInstanz = "sql.0"; // Historyinstanz, z.B.: "sql.0"
                                            var historyChangesOnly = false; // false: alle Werte werden aufgezeichnet
                                            var historyRentention = 0; // 0: Daten werden nicht automatisch gelöscht
                                            ! var cronStr = "*/5 * * * ";
                                            ! // --------------------------------------------------------------------------------------
                                            // -------------------- ab hier muss nichts mehr angepasst werden -----------------------
                                            // --------------------------------------------------------------------------------------
                                            ! var idDpArr = pfad + "DatenpunktArray";
                                            ! var dpArr = [];
                                            ! createState(idDpArr, "[]", {
                                            name: 'Array mit den schon angelegten Datenpunkten',
                                            desc: 'Array mit den schon angelegten Datenpunkt IDs',
                                            type: 'string',
                                            unit: '',
                                            role: 'value'
                                            }, function (){});
                                            ! var meastype = {
                                            1: {name:"Gewicht",einheit:"kg"},
                                            4: {name:"Größe",einheit:"m"},
                                            5: {name:"Fett_freie_Masse",einheit:"kg"},
                                            6: {name:"Fett_Ratio",einheit:"%"},
                                            8: {name:"Fett_Masse",einheit:"kg"},
                                            9: {name:"Diastolischer_Blutdruck",einheit:"mmHG"},
                                            10: {name:"Systolischer_Blutdruck",einheit:"mmHG"},
                                            11: {name:"Puls",einheit:"bpm"},
                                            12: {name:"Temperatur",einheit:""},
                                            54: {name:"SP02",einheit:"%"},
                                            71: {name:"Körpertemperatur",einheit:""},
                                            73: {name:"Hauttemperatur",einheit:""},
                                            76: {name:"Muskelmasse",einheit:""},
                                            77: {name:"Hydration",einheit:""},
                                            88: {name:"Knochenmasse",einheit:""},
                                            91: {name:"Pulswellengeschwindigkeit",einheit:""}
                                            }
                                            ! var customLogging = "{}";
                                            if(historyEin) customLogging = '{"' + historyInstanz + '": {"enabled": true,"changesOnly":'+historyChangesOnly+',"debounce": "1000","retention": '+historyRentention+',"changesRelogInterval": 0,"changesMinDelta": 0,"storageType": "Number"}}';
                                            customLoggingJson = JSON.parse(customLogging);
                                            ! var request = require('request');
                                            var oauth = require("oauth");
                                            ! var withings = new oauth.OAuth(
                                            "https://developer.health.nokia.com/account/request_token",
                                            "https://developer.health.nokia.com/account/access_token",
                                            consumerKey,
                                            consumerSecret,
                                            "1.0",
                                            null,
                                            "HMAC-SHA1"
                                            );
                                            ! function checkBody(body) {
                                            try {
                                            var json = JSON.parse(body);
                                            } catch (ex) {
                                            log("Withings: Fehler beim parsen des bodys","warn");
                                            return [false, null];
                                            }
                                            ! if(logOn) log('JSON von Withings ausgelesen: ' + JSON.stringify(json));
                                            if(logOn) log("Länge json: " + JSON.stringify(json).length);
                                            ! if(typeof json.status === "undefined") {
                                            log("Withings: Fehler beim Einlesen. Kein Status von Withings erhalten","warn");
                                            return [false, null];
                                            }
                                            if(logOn) log("Status: " + json.status);
                                            if(json.status !== 0 ) {
                                            log("Withings: Status: " + json.status + " - " + json.error,"warn");
                                            return [false, null];
                                            }
                                            ! if(typeof json.body === "undefined") {
                                            log("Withings: Fehler beim Einlesen. Kein Body von Withings erhalten","warn");
                                            return [false, null];
                                            }
                                            ! return [true, json];
                                            }
                                            ! function werteRunden(wert,stellen) {
                                            return Math.round(wert * Math.pow(10,stellen)) / Math.pow(10,stellen);
                                            }
                                            ! function setCreateState(id,val,forcecreation,common) {
                                            if(dpArr.indexOf(id) === -1) {
                                            log("Withings: neuer Datenpunkt angelegt: " + id);
                                            createState(id,val,forcecreation,common);
                                            dpArr.push(id);
                                            } else {
                                            setState(id,val);
                                            }
                                            }
                                            ! function getBodyMeasures(json) {
                                            var pfadFunc = pfad + subPfadKörperwerte;
                                            var datumAlt = getState(pfadFunc + ".ts_epoch").val;
                                            var epoch = json.body.measuregrps[0].date;
                                            var datum = formatDate(new Date(epoch
                                            1000),"YYYY-MM-DD, hh:mm");
                                            if(epoch === datumAlt) {
                                            log("Withings: Die Abfrage enthielt keine neuen Werte");
                                            return;
                                            }
                                            setCreateState(pfadFunc + '.json',JSON.stringify(json),true, {name:"json", type:"string"});
                                            setCreateState(pfadFunc + ".ts_epoch", epoch, true, {name:"ts_epoch", type:"number"});
                                            setCreateState(pfadFunc + ".ts_datum", datum, true, {name:"ts_datum", type:"string"});
                                            for (var i = 0; i < json.body.measuregrps[0].measures.length; i++) {
                                            var name = meastype[json.body.measuregrps[0].measures[i].type].name;
                                            var faktor = Math.pow(10,json.body.measuregrps[0].measures[i].unit);
                                            var wert = werteRunden(json.body.measuregrps[0].measures[i].value * faktor,1);
                                            var einheit = meastype[json.body.measuregrps[0].measures[i].type].einheit;
                                            if(logOn) log (name + ": " + wert + einheit);
                                            setCreateState(pfadFunc + "." + name, wert, true, {name:name, type:"number", unit: einheit , custom:customLoggingJson});
                                            }
                                            return;
                                            }
                                            ! function readData() {
                                            ! var url = withings.signUrl("http://wbsapi.withings.net/measure?action=getmeas&limit=1&userid=" + userid, oauth_access_token, oauth_access_token_secret);
                                            ! try {
                                            request(url, function (error, response, body) {
                                            if (!error && response.statusCode == 200) { // kein Fehler, Inhalt im body
                                            var checkResult = checkBody(body);
                                            if (checkResult[0]) {
                                            var json = checkResult[1];
                                            getBodyMeasures(json);
                                            setState(idDpArr,JSON.stringify(dpArr));
                                            }

                                                    } else {
                                                        if(typeof response.statusCode !== "undefined") log("StatusCode = " + response.statusCode,"warn");
                                                        if(typeof error !== "undefined") log("Withings: Fehler beim Abfragen:" + error, 'error'); // Error beim Einlesen
                                                    }
                                                });
                                            } catch (e) {
                                                log('Fehler (try) ' + e, 'error');
                                            }
                                            

                                            }

                                            ! // Subscriptions
                                            // -----------------------------------------------------------------------------
                                            ! /*
                                            on({id:"Datenpunkt id",change:'ne'}, function (obj) {
                                            // Funktionen
                                            });
                                            */
                                            ! // regelmässige Wiederholungen
                                            // -----------------------------------------------------------------------------
                                            schedule(cronStr, readData); //
                                            ! // Wird ausgeführt, wenn das Skript gestoppt wird:
                                            // -----------------------------------------------
                                            // close connection if script stopped
                                            onStop(function skriptStop () {
                                            if(logOn) log("----------- Skript: " + name + " wurde beendet -----------");
                                            // Funktionen, die noch ausgeführt werden sollen, wenn das Skript beendet wurde
                                            setState(idDpArr,JSON.stringify(dpArr));
                                            }, 100 /ms/);
                                            ! // main
                                            // -----------------------------------------------------------------------------
                                            function main() {
                                            if(logOn) log("----------- Skript: " + name + " gestartet -----------");
                                            // Funktionen, die beim Start des Skripts ausgeführt werden
                                            dpArr = JSON.parse(getState(idDpArr).val);
                                            readData();
                                            }
                                            ! // Start Skript:
                                            // -----------------------------------------------------------------------------
                                            setTimeout(main, 1000);` [/i][/i][/i][/i]

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            757
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            27
                                            126
                                            23091
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo