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.
    • K
      Kaiman55 @stoffel67 last edited by

      @stoffel67
      So ist es bei mir auch.
      Keine Ahnung, was falsch ist. Vielleicht liegt es an den zwei Personen, die ich hinterlegt habe.
      Hast Du dir den Entwickler Account auch erst jetzt geholt? Vielleicht gehts nur bei den älteren.

      Ich habe mal mit IFTTT gespielt.
      Bekomme da mein Gewicht als Push angezeigt.
      Und an mein Lametrics Display bekomme ich es so auch gesendet.
      Allerdings noch ohne ioBroker.
      Ich muss mir @Marty56 Doku mal genauer anschauen, wie ich das dann als Objekt speicher.

      Danke Dir trotzdem sehr für die Hilfe.

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

        ich habe auch zwei Personen, wird ja in der der ersten Maske angezeigt, und man wählt eine Person, dann auf "weiter"
        und APP zustimmen, dann kommt der callback auf deine angegebene URL mit dem "code"

        K 1 Reply Last reply Reply Quote 0
        • K
          Kaiman55 @stoffel67 last edited by

          @stoffel67 sagte in Withings Daten einlesen:

          ich habe auch zwei Personen, wird ja in der der ersten Maske angezeigt, und man wählt eine Person, dann auf "weiter"
          und APP zustimmen, dann kommt der callback auf deine angegebene URL mit dem "code"

          Wie gesagt: Die beiden Personen sehe ich auch. Klicke ich auf eine (egal welche) kommt die o.g. Meldung.

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

            wie sieht denn dein Aufruf aus? ( Client_id als xxxx)

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

              Ich habe mal mit IFTTT gespielt.
              Bekomme da mein Gewicht als Push angezeigt.

              dann bekommst du ja dein Gewicht?😳

              K 1 Reply Last reply Reply Quote 0
              • K
                Kaiman55 @stoffel67 last edited by

                @stoffel67 sagte in Withings Daten einlesen:

                wie sieht denn dein Aufruf aus? ( Client_id als xxxx)

                https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=MEINE_ID_NUMMER&scope=user.info,user.metrics,user.activity&redirect_url=http://fixeIP_meines_Servers/cgi-bin/withings.cmd

                Die IP ist erreichbar.
                Sieht also aus wie bei Dir.
                Egal... Ich geb erstmal auf. So wichtig ist es mir dann nicht.

                Vielen Dank trotzdem.

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

                  @stoffel67 sagte in Withings Daten einlesen:

                  Ich habe mal mit IFTTT gespielt.
                  Bekomme da mein Gewicht als Push angezeigt.

                  dann bekommst du ja dein Gewicht?😳

                  Ja. So ja. Halt nur auf dem Handy.
                  Hab die Doku noch nicht gelesen, wie ich IFTTT in ioBroker dazu bringe, dass ich ein Objekt vom Gewicht bekomme.
                  Schaue ich mir die Tage mal an.

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

                    NEIN, sieht er nicht.... wo ist der Parameter "&state"
                    und hast du auch im Ordner cgi-bin eine Datei withings.cmd?

                    K 1 Reply Last reply Reply Quote 0
                    • K
                      Kaiman55 @stoffel67 last edited by

                      @stoffel67 sagte in Withings Daten einlesen:

                      NEIN, sieht er nicht.... wo ist der Parameter "&state"

                      🙂 Den habe ich versehendlich für den Post rausgelöscht. 😄

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

                        https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=MEINE_ID_NUMMER&scope=user.info,user.metrics,user.activity&redirect_url=http://fixeIP_meines_Servers/cgi-bin/withings.cmd

                        Die IP ist erreichbar.
                        Vielen Dank trotzdem.

                        hast du eine IP angegeben?
                        das geht lt. Doku nicht:
                        Your URL must :
                        •be a valid URL, provided as a URL-encoded string. Please refer to w3schools URL encoding reference to learn more about URL encoding.
                        •not be greater than 255 characters.
                        •neither contain an IP or 'localhost'. Only port 80 and 443 are allowed.

                        K 1 Reply Last reply Reply Quote 0
                        • K
                          Kaiman55 @stoffel67 last edited by

                          @stoffel67 sagte in Withings Daten einlesen:

                          https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=MEINE_ID_NUMMER&scope=user.info,user.metrics,user.activity&redirect_url=http://fixeIP_meines_Servers/cgi-bin/withings.cmd

                          Die IP ist erreichbar.
                          Vielen Dank trotzdem.

                          hast du eine IP angegeben?
                          das geht lt. Doku nicht:
                          Your URL must :
                          •be a valid URL, provided as a URL-encoded string. Please refer to w3schools URL encoding reference to learn more about URL encoding.
                          •not be greater than 255 characters.
                          •neither contain an IP or 'localhost'. Only port 80 and 443 are allowed.

                          Oh. Das habe ich überlesen.
                          Meine Herren machen die das kompliziert.

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

                            Kann jemand netterweise von Euch nochmals das Script hier posten um das Gewicht der Withings Waage auszulesen.
                            Danke!

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

                              meins sieht so aus: ( Client_id und Client_secret mußt du noch selbst anpassen)

                              //* Withings Daten einlesen
                              
                              
                              /*
                              SB
                              oauth_token=XXXXXX
                              oauth_token_secret=XXXXXX
                              userid=YYYYYYYY
                              deviceid=0
                              
                              BB
                              oauth_token=XXXXXX
                              oauth_token_secret=XXXXXXX
                              userid=XXXXXX
                              deviceid=0
                              */
                              
                              const request = require("request");
                              var client_ID      = "xxxxxxxxx";
                              var client_secret = "xxxxxxxxx";
                              
                              /*
                              createState('Withings.SB.Gewicht', {name:'Withings Gewicht', unit: 'kg'});
                              createState('Withings.SB.Gewicht.Datum', {name:'Withings Gewicht (Datum)'});
                              createState('Withings.SB.Gewicht.Datum.epoc', {name:'Withings Gewicht (Datum im UNIX EPOC Format)'});
                              createState('Withings.BB.Gewicht', {name:'Withings Gewicht', unit: 'kg'});
                              createState('Withings.BB.Gewicht.Datum', {name:'Withings Gewicht (Datum)'});
                              createState('Withings.BB.Gewicht.Datum.epoc', {name:'Withings Gewicht (Datum im UNIX EPOC Format)'});
                              createState('Withings.SB.access_token', {name:'access_token', unit: ''},access_token);
                              createState('Withings.SB.refresh_token', {name:'refresh_token', unit: ''},refresh_token);
                              createState('Withings.BB.access_token', {name:'access_token', unit: ''},access_token);
                              createState('Withings.BB.refresh_token', {name:'refresh_token', unit: ''},refresh_token);
                              */
                              
                              function datum_heute() {
                                  var heute = new Date();
                                  var tag_roh = heute.getDate(),
                                      tag = ((tag_roh <10) ? '0' : '') + tag_roh,
                                      monat_roh = heute.getMonth() + 1,
                                      monat = ((monat_roh <10) ? '0' : '') + monat_roh,
                                      jahr = heute.getFullYear();
                              
                                  var datum = jahr + '-' + monat + '-' + tag;
                               
                                  return(datum);
                              }
                              
                              function refresh_access_token(user) {
                                  var access_token=getState('javascript.0.Withings.'+user+'.access_token').val;
                                  var refresh_token=getState("Withings."+user+".refresh_token").val;
                                  var lc= getState('javascript.0.Withings.'+user+'.refresh_token').lc;
                                  console.log (lc);
                                  var delta_t=Date.now()-lc;
                                  console.log ('Vergangene Zeit'+delta_t);
                                  var data="grant_type=refresh_token&client_id=xxxxxxxx&client_secret=yyyyyyyy&refresh_token="+refresh_token;
                              
                                  var options ={
                                     url:'https://account.withings.com/oauth2/token',
                                     method:'POST',
                                     body:data
                                  };
                              
                                      log('Withings refresh  token');
                                      request(options, function(error, response,body) {
                                          log (response);
                                          log(body);
                                          if (!error) {
                                              result = JSON.parse(body);
                                              access_token=result.access_token;
                                              refresh_token=result.refresh_token;
                                              var userid=result.userid
                                              console.log("AT:"+access_token);
                                              console.log("RT:"+refresh_token);
                                              setState('Withings.'+user+'.access_token',access_token);
                                              setState('Withings.'+user+'.refresh_token',refresh_token);
                                              setState('Withings.'+user+'.userid',userid);
                                          }
                                      });   
                                      log ('jetzt Daten lesen ..........'+delta_t)
                                      withings_einlesen('gewicht',user,access_token);
                              
                              }
                              
                              function withings_einlesen(datentyp,user,access_token) { // Eigenen Daten statt xxxxxx einfügen
                                  var zeit=Date.now()/1000-3600;
                                  log ('AT:::'+access_token)
                               
                                 
                                  // Abfrage einzelner Daten nach Typ
                                  if (datentyp === "gewicht") {
                                      var url = "https://wbsapi.withings.net/measure?action=getmeas&access_token="+access_token+"&meastype=1&category=1"//&lastupdate="+zeit;
                                      log('Withings Gewicht wird eingelesen');
                                      log (url);
                                      request.get(url, function(error,data, response) {
                                          log (error);
                                          var result;
                                          if (!error) {
                                              try{
                                                  result = JSON.parse(response);
                                                  data = JSON.stringify(result, null, 2);
                                                  log('Kein Fehler :-D bei Withings Gewicht');
                                              } catch (e){
                                                  log('Parse Fehler:' + e);
                                              }
                                                  result = JSON.parse(response);
                                              if (result.status === 0) {
                                                  console.log("hole Daten von Withings!");
                                                  log (data)  // hier wird die ganze Wurst ausgegeben!!!!!!
                                                  var gewicht = result.body.measuregrps[0].measures[0].value;
                                                   log('-------> Gewicht: ' + gewicht);
                                                  pw=Math.pow(10,result.body.measuregrps[0].measures[0].unit);
                                                  setState('Withings.'+user+'.Gewicht', gewicht *pw);
                                                  var gewicht_epoc = (result.body.measuregrps[0].date+7200)*1000; //7200=Sommerzeit
                                                  setState('Withings.'+user+'.Gewicht.Datum', new Date(gewicht_epoc)); // Datum wird umgewandelt
                                                  setState('Withings.'+user+'.Gewicht.Datum.epoc', gewicht_epoc); //EPOC wird übernommen
                                              } else {
                                                  log('Fehler beim Auswerten'+result.error)
                                              }
                                          } else {
                                              log('Fehler: ' + error);
                                          }
                                      });
                                  } else if (datentyp === "schritte") {
                                      datum = datum_heute();
                                      url = withings.signUrl("http://wbsapi.withings.net/measure?action=getmeas&date=" + datum + "&userid=" + userid, oauth_access_token, oauth_access_token_secret);
                                      log('Withings Schritte werden eingelesen');
                                      log (url)
                                      withings.get(url, null, null, function(error, response) {
                                          if (!error) {
                                              var result;
                                              try{
                                                  result = JSON.parse(response);
                                                  var data = JSON.stringify(result, null, 2);
                                                  log('Kein Fehler :-D bei Withings Schritte');
                                              } catch (e){
                                                  log('Parse Fehler:' + e);
                                              }
                                              if (result) {
                                                  log (result)
                                                  var schritte = result.body.steps;
                                                  // log('-------> Schritte: ' + schritte);
                                                  setState('Withings.Schritte', schritte);
                                                  var schritte_datum = result.body.date;
                                                  setState('Withings.Schritte.Datum', schritte_datum); // Datum wird übernommen
                                              }
                                          } else {
                                              log('Fehler: ' + error);
                                          }
                                      });
                                  }
                              
                              }
                              
                                 
                              
                              
                              on('javascript.0.Withings.callback_SB', function(data) {
                                  var cb = data.state.val;
                                  //log('Zustand'+cb)
                                  var lc= getState('javascript.0.Withings.callback_SB').lc;
                                  console.log (lc);
                                  console.log (Date.now());
                                  var delta_t=Date.now()-lc;
                                  console.log ('Vergangene Zeit'+delta_t);
                                  if (cb === true && delta_t > 5) {
                                      log ('lese Nokia SB');
                                      refresh_access_token('SB');
                                      //withings_einlesen('gewicht','SB');
                                  }
                                  setState('javascript.0.Withings.callback_SB', false);
                              });
                              
                              on('javascript.0.Withings.callback_BB', function(data) {
                                  var cb = data.state.val;
                                  //log('Zustand'+cb)
                                  var lc= getState('javascript.0.Withings.callback_BB').lc;
                                  console.log (lc);
                                  var delta_t=Date.now()-lc;
                                  console.log ('Vergangene Zeit'+delta_t);
                                  if (cb === true && delta_t > 5) {
                                      log ('lese Nokia BB');
                                      refresh_access_token('BB');
                                      //withings_einlesen('gewicht','BB');
                                  }
                                  setState('javascript.0.Withings.callback_BB', false);
                              });
                              
                              //refresh_access_token("BB")
                              //refresh_access_token("SB")
                              
                              Stuebi 1 Reply Last reply Reply Quote 0
                              • Stuebi
                                Stuebi @stoffel67 last edited by Stuebi

                                @stoffel67 , danke für das Script. Ich habe noch eine Frage. Ich muss doch einmalig vorher folgendes im Webbrowser aufrufen um den authentication code zu erhalten:

                                https://account.withings.com/oauth2_user/authorize2?response_type=code&client_id=xxxxxxxxxxxxx&state=OK&scope=user.info,user.metrics,user.activity&redirect_url=http://my-ddns-address/withings.cmd
                                

                                Ich bekomme immer folgende Fehlermeldung zurück.

                                {"errors":[{"message":"redirect_uri_mismatch: The redirect URI provided is missing or does not match partner callback url"}]}
                                

                                Kannst Du auch das Script withings.cmd zur Verfügung stellen?

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

                                  "redirect_url=http://my-ddns-address/withings.cmd"

                                  hast du hier deine Adresse eingetragen?
                                  gibt es bei dir ein "withings.cmd"
                                  meine hilft dir da nicht ( die heißt z.B. callback_SB.tcl).... du brauchst an deinem WEB-Server etwas ( evtl Python?) als Aufruf für die Rückgabe eines "HTTP OK"

                                  aber das ist doch so schon in der Withings API beschrieben...

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

                                    Ich habe mit die Lösung per IFTTT gebaut für Waage und Blutdruckmonitor, so dass der ganze Kram mit Developer Keys nicht notwendig ist. Sie ist noch nicht ganz fertig getestet, bin aber ganz zuversichtlich, dass es ok funktioniert. Hat das jemand Interesse an einer Zusammenfassung wie ich das gemacht habe?

                                    Mauflo 1 Reply Last reply Reply Quote 0
                                    • Mauflo
                                      Mauflo @bnz99 last edited by Mauflo

                                      @bnz99 Ja, ich hätte großes Interesse daran - bis jetzt scheitere ich kläglich am Authorisierungsprozess via Javascript. Obwohl ich mir viel lieber einen eigenen Script schreiben würde, der meine Daten ausliest und die in die Datenpunkte überträgt. Ich weiß nämlich immer noch nicht was in der withings.cmd stehen muß und wo ich die ablegen muss, damit der Autorisierungsprozess funktioniert. Braucht man dafür einen Webserver? Hab ich nämlich nicht!

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

                                        @Mauflo ja den braucht man, ich dachte, dass das oben deutlich rauskommt,...
                                        man braucht einen Webserver, der min. ein "OK" an withings zurückgibt

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

                                          1. Zunächst brauchen wir einen iobroker app key.

                                          Ich habe einen iobroker pro account. Wenn man sich dort einloggt findet man unter APP-KEYS den URL-Anteil, den ich ausgeblendet habe. Wenn der noch nicht existiert, muss man den dort mit "App Key erzeugen" anlegen. Es geht wahrscheinlich auch mit einem iobroker.net app key, habe ich aber nicht getestet.

                                          1. Wir brauchen einen IFTTT key. Den gibt es bei ifttt.com, wenn man auf https://ifttt.com/maker_webhooks/ geht und auf documentation klickt. Da steht dann "Your key is:".

                                          2. Dann erzeugen wir ein ifttt applet. Bei ifttt.com create->if withings body scale new measurement then webhook:

                                          85f39a12-00d0-4e90-ab1a-ae62b186c905-image.png

                                          Der JSON Anteil hier noch mal zum kopieren:

                                          { "iftttType":"withingsBodyScale", "weightKg":{{WeightKg}}, "leanMassKg":{{LeanMassKg}}, "fatMassKg":{{FatMassKg}}, "fatPercent":{{FatPercent}},"measuredAt":" {{MeasuredAt}}" }
                                          

                                          Die URL setzt sich aus dem ifttt Anteil von iobroker.pro/iobroker.net zusammen + den appkey Anteil.

                                          1. Als nächstes müssen wir iftt im iobroker Cloud Adapter konfigurieren. Wenn der noch nicht installiert ist, muss der installiert werden. Wenn man nun die cloud.0 Instanz konfiguriert, muss der App Key eingetragen sein aus der iobroker.pro oder iobroker.net Konfiguration. Im Tab Services und IFTTT muss der IFTTT Key eingetragen werden. Der Rest kann so bleiben.

                                          2. Wir kriegen jetzt den json payload von Withings in iobroker reingepusht. Er liegt im Objektbaum unter cloud.0/services/ifttt. Da wird immer nur der jeweils aktuell übermittelte json string reinkopiert. Wenn wir vom Blutdruckmessgerät auch Daten kriegen (Vorgehen ist analog zu dem hier), kommt das hier auch reinkopiert. D.h. es bleibt hier auch nicht daurhaft als "Withings Wert" stehen. Jetzt muss der JSON payload zerlegt und sortiert abgelegt werden. Dafür können wir ein Blockly Skript anlegen. Mein Skript, welches auch das Blutdruckmessgerät unterstützt sieht so aus:

                                          61435317-3320-434d-9a9d-c1fa7ca41014-image.png

                                          1. Der im Skript referenzierte Code ist der hier:
                                          var moment = require('moment');
                                          require("moment/min/locales.min");
                                          moment.locale('en');
                                          
                                          var dateTime = moment(dateString,"MMMM DD, YYYY at hh:ssp", "Europe/Berlin");
                                          
                                          return dateTime.toDate();
                                          

                                          Damit das funktioniert, muss im Javascript Adapter "moment" als zusätzliches npm Modul eingetragen werden. Der Datumscode funktioniert aber scheinbar noch nicht ganz korrekt. Der String sieht aktuell etwas kaputt aus bei mir. Ich hatte aber noch keine Zeit mir das anzusehen.

                                          Ich hoffe das hilft soweit!

                                          Mauflo X 3 Replies Last reply Reply Quote 0
                                          • Mauflo
                                            Mauflo @bnz99 last edited by

                                            @bnz99 Herzlichen Dank! Das klingt sehr vielversprechend. Ich werde das am WE mal versuchen. Ich habe einen .net Account. Außerdem habe ich ein Nokia Home System, eine HR Uhr und eine Body Cardio Waage. Daher werde ich eine Menge Daten auseinanderzuklauben haben. Außerdem möchte ich die Daten noch in eine SQL Datenbank eintragen lassen, damit ich sie später im VIS wiederverwenden kann. Weiters möchte ich gerne die Daten dazu verwenden, dass Alexa bei bestimmten Werten entsprechende Ansagen macht. Wird also ein größeres Projekt. 😉 Daher möchte ich mich für Deine Unterstützung herzlich bedanken. Sollte ich entsprechende Lösungen programmiert haben, werde ich das hier auch veröffentlichen, damit andere User von unseren Erfahrungen profitieren können! LG und nochmals Danke!

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            777
                                            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