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.
    • 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
                                      • D
                                        dtp last edited by

                                        @ruhr70:

                                        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. `

                                        Das Developer-Konto hatte ich ja schon angelegt. Es muss einem Dummen halt nur gesagt werden, dass die erzeugten API-Daten als Consumer-Daten einzutragen sind. Für mich ist halt Entwickler != Nutzer.

                                        @ruhr70:

                                        und Callback lässt Du leer `

                                        Alles klar.

                                        Danke.

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

                                          Hallo Ruhr,

                                          vielen Dank für das neue Script. Ich habe es ausprobiert und meine Werte (bei mir Gewicht, Blutdruck, Puls und Größe) werden ohne Probleme ausgelesen und in den Objekten gespeichert. Bei der Größe wird gut gerundet. Ich habe 188cm eingegeben und es wird auf 1,9m gerundet.

                                          Für die Schritte ist das Script nicht ausgelegt, oder?

                                          Nochmal vielen Dank für Deine Arbeit!

                                          Grüße,

                                          Balu

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

                                            Hallo,

                                            endlich wieder Bewegung hier 😄

                                            Hab es bisher leider auch nicht weiter geschafft, als die Blutdruckdaten und die Waage einzulesen.

                                            Früher gingen ja auch Schritte, jetzt komme ich da nicht weiter.

                                            Stoffel67 hat auch die Notifications hingewiesen. Das habe ich mir auch mal angesehen und bin wieder ausgestiegen :?

                                            Zu IFTTT kann ich nur raten. Wenn es klappt, dann gehe doch den Weg und setze damit die States in ioBroker über der Cloud-Adapter. Ist in der Cloud-Adapter-Doku und hier im Forum erklärt. Statt dich selbst ins Netzwerk von Nokia zu skripten, lasse Nokia die Daten an IFTT schicken. IFTTT reagiert darauf und sendet sie an den Cloud-Adapter, der dann innerhalb ioBrokers einen State setzt. Voilá.

                                            Gruß

                                            Pix

                                            PS: Wie ist der Nokia Sleep?

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            836
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            27
                                            126
                                            23073
                                            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