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

                            Ich wollte es ja gerne mit oauth probieren, stoße da aber irgendwie auf Probleme.

                            Als erstes musste ich mal oauth für meinen Docker-Container auf der Synology DiskStation installieren und zwar nicht direkt unter "/opt/iobroker/", sondern unter "/opt/iobroker/node_modules/iobroker.javascriptnode".

                            cd /opt/iobroker/node_modules/iobroker.javascriptnode
                            npm install oauth
                            

                            Damit konnte dann auch das Javascript wieder ausgeführt werden. So weit, so gut.

                            Mein Problem sind aber irgendwie immer noch die https://developer.health.nokia.com/api beschriebenen vier Schritte, denn am Ende von Schritt 4 erhalte ich immer die Meldung

                            {"status":503,"error":"Invalid Params"}
                            

                            Vielleicht, um noch mal meine Vorgehensweise kurz zu schildern.

                            Für Schritt 1 verwende ich den API Key und das API Secret, was ich mir als Entwickler erzeugen lassen habe. Daraufhin erhalte ich ein oauth_token und ein oauth_token_secret.

                            Für Schritt 2 verwende ich dann das oauth_token und das oauth_token_secret aus Schritt 1. Klicke ich auf den so erzeugten Link, erhalte ich folgende Seite:

                            996_2018-05-17_15h50_46.png
                            Sieht ja eigentlich gut aus, oder? Im Feld unter "Diese Genehmigung wird angewendet für:" wirdauch korrekt mein Name angezeigt. Danach klicke ich auf "Genehmigen" und erhalte wieder den oauth_token aus Schritt 1 sowie einen so genannten oauth_verifier angezeigt.

                            Weiter geht's zu Schritt 3. Dort gebe ich wieder den oauth_token aus Schritt 1 ein. Klicke ich dann auf den Link unter "Result", wird mir n neuer oauth_token samt oauth_token_secret sowie eine userid und eine deviceid angezeigt. Letztere ist bei mir immer 0.

                            Gebe ich den oauth_token und den oauth_token_secret aus Schritt 3 in Schritt 4 ein, erhalte ich zwar einen Link unter "Result", doch wenn ich diesen anklicke, kommt die obige Fehlermeldung.

                            Irgendwo ist doch da der Wurm drin, oder? Auch die nachfolgende Anfrage mit der unter Schritt 3 angzeigte userid führt zur selben Fehlermeldung:

                            https://api.health.nokia.com/v2/measure?action=getactivity&userid=xxxxxxx&date=2018-05-15
                            

                            Bis dann,

                            Thorsten

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

                              @pix:

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

                              Auch wenn ich die anderen Geräte nicht habe, wollte ich das Skript um die anderen Themen erweitern.

                              Per IFTTT lasse ich mir heute schon die Werte direkt senden. Und werte sie mit einem anderen Skript dann aus.

                              Werde das Skript so erweitern, dass IFTTT als Trigger verwendet wird und dann das Skript die Werte abruft.

                              Wie war dass denn mit den Schritten? Du hast immer den letzten Wert abgefragt. Waren die Infos trotzdem vollständig (wg. dem 3 Minuten Polling?)?

                              Meintest Du mich wg. dem Sleep? Ich habe nur Aura und die steht seit einem Jahr im Schrank :roll:

                              Werde sie aber wieder anschliessen 🙂

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

                                @dtp:

                                Sieht ja eigentlich gut aus, oder? Im Feld unter "Diese Genehmigung wird angewendet für:" wirdauch korrekt mein Name angezeigt. Danach klicke ich auf "Genehmigen" und erhalte wieder den oauth_token aus Schritt 1 sowie einen so genannten oauth_verifier angezeigt. `

                                Ab Schritt 3 findest Du die benötigten Werte in der URL und nicht im angezeigtem Ergebnis im Browser.

                                Hattest Du die Werte aus der URL kopiert?

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

                                  @ruhr70:

                                  Per IFTTT lasse ich mir heute schon die Werte direkt senden. Und werte sie mit einem anderen Skript dann aus.

                                  Werde das Skript so erweitern, dass IFTTT als Trigger verwendet wird und dann das Skript die Werte abruft. `

                                  IFTTT nutze ich aktuell nur in Verbindung mit der Homebridge als Plugin, um z.B. meine Kaffeemaschine per SIRI zu steuern. Problem ist aber, dass ich sehr häufig Fehler mit den Webhooks angezeigt bekomme. Und die wären ja auch in Verbindung mit anderen Services vorhanden. Daher würde ich persönlich eine Lösung bevorzugen, die nicht über IFTTT läuft.

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

                                    Ha, es funktioniert! 8-)

                                    Kurzum, Schritt 4 ist gar nicht notwendig.

                                    Hab jetzt einfach mal folgende Werte in https://forum.iobroker.net/viewtopic.php?f=21&t=1206&p=150595#p150366 eingetragen:

                                    var consumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // API Key
                                        consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // API Secret
                                        oauth_access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // oauth_token aus Step 3
                                        oauth_access_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // oauth_token_secret aus Step 3
                                        userid = "xxxxxxxx"; // userid aus Step 3
                                    
                                    

                                    Damit erhalte ich nun folgende Werte (hab das Skript dazu von Withings auf Nokia angepasst):

                                    996_2018-05-18_09h46_48.png
                                    Ich habe aber zusätzlich noch die Zeile

                                    var url = nokia.signUrl("http://wbsapi.withings.net/measure?action=getmeas&limit=1&userid=" + userid, oauth_access_token, oauth_access_token_secret);
                                    

                                    ersetzt durch

                                    var url = nokia.signUrl("https://api.health.nokia.com/measure?action=getmeas&userid=" + userid, oauth_access_token, oauth_access_token_secret);
                                    

                                    Damit funktioniert es auch, und es besteht keine Abhängigkeit mehr vom ggf. veralteten Withings-Server.

                                    Jetzt würde ich noch gerne die Werte meines Nokia Sleep abfragen. Das dürfte mit

                                    https://api.health.nokia.com/v2/sleep?action=getsummary
                                    

                                    gehen. Muss nur noch mal schauen, wie ich das in das Skript von ruhr70 eingebunden bekomme.

                                    Gruß,

                                    Thorsten

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

                                      Hi,

                                      ich stelle mir ein angepassten Skripte dann in etwa so vor:

                                      ! ```
                                      var logOn = true; // true: zusätzliche Ausgaben im ioBroker Log ! var username = "Thorsten"; ! var consumerKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // API Key consumerSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // API Secret oauth_access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // oauth_token aus Step 3 oauth_access_token_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", // oauth_token_secret aus Step 3 userid = "xxxxxxxxx"; // userid aus Step 3 ! var pfad = "Nokia."+username+"."; // Pfad, in dem neue Datenpunkte angelegt werden sollen ! var subPfadKoerperwerte = "Körperwerte"; // Unterordner, in dem die Köperwerte angelegt werden var subPfadSleep = "Sleep"; // Unterordner, in dem die Schlafwerte angelegt werden ! var historyEin = true; // true: automatisch History beim Anlegen der Datenpunkte konfigurieren var historyInstanz = "sql.0"; // Historyinstanz, z.B.: "sql.0" var historyChangesOnly = true; // false: alle Werte werden aufgezeichnet var historyRentention = 0; // 0: Daten werden nicht automatisch gelöscht ! var cronStrStatic = "* */5 * * *"; // Werte alle 5 Stunden auslesen var cronStrDynamic = "*/2 * * * *"; // Werte alle 2 Minuten auslesen ! // -------------------------------------------------------------------------------------- // -------------------- 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 nokia = 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("Nokia: Fehler beim parsen des bodys","warn"); return [false, null]; } if(logOn) log('JSON von Nokia ausgelesen: ' + JSON.stringify(json)); if(logOn) log("Länge json: " + JSON.stringify(json).length); if(typeof json.status === "undefined") { log("Nokia: Fehler beim Einlesen. Kein Status von Nokia erhalten","warn"); return [false, null]; } if(logOn) log("Status: " + json.status); if(json.status !== 0 ) { log("Nokia: Status: " + json.status + " - " + json.error,"warn"); return [false, null]; } if(typeof json.body === "undefined") { log("Nokia: Fehler beim Einlesen. Kein Body von Nokia 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("Nokia: neuer Datenpunkt angelegt: " + id); createState(id,val,forcecreation,common); dpArr.push(id); } else { setState(id,val); } } ! function getBodyMeasures(json) { var pfadFunc = pfad + subPfadKoerperwerte; 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("Nokia: 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 readDataStatic() { var url = nokia.signUrl("https://api.health.nokia.com/measure?action=getmeas&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("Nokia: Fehler beim Abfragen:" + error, 'error'); // Error beim Einlesen } }); } catch (e) { log('Fehler (try) ' + e, 'error'); } } ! function readDataDynamic() { var url = nokia.signUrl("https://api.health.nokia.com/v2/sleep?action=getsummary&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("Nokia: 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(cronStrStatic, readDataStatic); // schedule(cronStrDynamic, readDataDynamic); // ! // 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); readDataStatic(); readDataDynamic(); } ! // Start Skript: // ----------------------------------------------------------------------------- setTimeout(main, 1000);
                                      Achtung: das Skript ist nur ein Rohentwurf auf Basis von ruhr70s Skript. Vielleicht kann sich das ja mal jemand ansehen. Die Idee ist, dass man zwischen statischen und dynamischen Abfragewerten unterscheidet. Statisch eher für die Body-Daten, die eh nur wenige Male am Tag erfasst werden und dynamisch für Daten, auf die ggf. schneller reagiert werden muss, wie z.B. die Daten das Sleep-Sensors.
                                      ! Zudem habe ich mal einen Username eingeführt, um für unterschiedliche User entsprechende Skripte anlegen und Werte abfragen zu können. Das sieht dann so aus:
                                      ! 996_2018-05-18_12h37_50.png
                                      ! Bis dann,
                                      ! Thorsten[/i][/i][/i][/i]

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

                                        cool. Du nimmst mir ja die Arbeit ab :mrgreen:

                                        1 Reply Last reply Reply Quote 0
                                        • bahnuhr
                                          bahnuhr Forum Testing Most Active last edited by

                                          Hallo und guten Morgen,

                                          könnte dieses oauth auch bei google funktionieren?

                                          Hintergrund:

                                          Ich versuche ja nun seit Monaten mir ein script zu basteln um von google contacts mir die Telefon-Bilder zu holen.

                                          Und dort ist auch ein oauth Verfahren beschrieben.

                                          Bekomme dies leider nicht hin.

                                          Vielleicht hat ja jemand dies schon mal probiert und evtl. ein Code-Schnipsel für mich.

                                          Danke im Voraus.

                                          mfg

                                          Dieter

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

                                            @ruhr70:

                                            cool. Du nimmst mir ja die Arbeit ab :mrgreen: `

                                            Leider nicht so ganz. Erstens war ich ne Woche weg und zweitens fehlen mir die Fähigkeiten, das Skript an den entscheidenden Stellen zur Einbindung des Nokia Sleep anzupassen. Vielleicht kannst du mich hier noch etwas unterstützen?

                                            Gruß,

                                            Thorsten

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            952
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

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