Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. Withings Daten einlesen

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.2k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.9k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.3k

Withings Daten einlesen

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
126 Beiträge 27 Kommentatoren 32.8k Aufrufe 19 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • ruhr70R Offline
    ruhr70R Offline
    ruhr70
    schrieb am zuletzt editiert von
    #51

    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]

    Adapter: Fritzbox, Unify Circuit
    Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

    1 Antwort Letzte Antwort
    0
    • D Offline
      D Offline
      dtp
      schrieb am zuletzt editiert von
      #52

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

      ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

      1 Antwort Letzte Antwort
      0
      • B Offline
        B Offline
        Balu1973
        schrieb am zuletzt editiert von
        #53

        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 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          pix
          schrieb am zuletzt editiert von
          #54

          Hallo,

          endlich wieder Bewegung hier :D

          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?

          ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

          1 Antwort Letzte Antwort
          0
          • D Offline
            D Offline
            dtp
            schrieb am zuletzt editiert von
            #55

            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

            ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

            1 Antwort Letzte Antwort
            0
            • ruhr70R Offline
              ruhr70R Offline
              ruhr70
              schrieb am zuletzt editiert von
              #56

              @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 :-)

              Adapter: Fritzbox, Unify Circuit
              Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

              1 Antwort Letzte Antwort
              0
              • ruhr70R Offline
                ruhr70R Offline
                ruhr70
                schrieb am zuletzt editiert von
                #57

                @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?

                Adapter: Fritzbox, Unify Circuit
                Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                1 Antwort Letzte Antwort
                0
                • D Offline
                  D Offline
                  dtp
                  schrieb am zuletzt editiert von
                  #58

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

                  ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                  1 Antwort Letzte Antwort
                  0
                  • D Offline
                    D Offline
                    dtp
                    schrieb am zuletzt editiert von
                    #59

                    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

                    ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                    1 Antwort Letzte Antwort
                    0
                    • D Offline
                      D Offline
                      dtp
                      schrieb am zuletzt editiert von
                      #60

                      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]

                      ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                      1 Antwort Letzte Antwort
                      0
                      • ruhr70R Offline
                        ruhr70R Offline
                        ruhr70
                        schrieb am zuletzt editiert von
                        #61

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

                        Adapter: Fritzbox, Unify Circuit
                        Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                        1 Antwort Letzte Antwort
                        0
                        • bahnuhrB Online
                          bahnuhrB Online
                          bahnuhr
                          Forum Testing Most Active
                          schrieb am zuletzt editiert von
                          #62

                          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


                          Wenn ich helfen konnte, dann Daumen hoch (Pfeil nach oben)!
                          Danke.
                          gute Forenbeiträge: https://forum.iobroker.net/topic/51555/hinweise-f%C3%BCr-gute-forenbeitr%C3%A4ge
                          ScreenToGif :https://www.screentogif.com/downloads.html

                          1 Antwort Letzte Antwort
                          0
                          • D Offline
                            D Offline
                            dtp
                            schrieb am zuletzt editiert von
                            #63

                            @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

                            ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                            1 Antwort Letzte Antwort
                            0
                            • ruhr70R Offline
                              ruhr70R Offline
                              ruhr70
                              schrieb am zuletzt editiert von
                              #64

                              Sleep habe ich nicht, wollte aber mein Aura mal wieder aufbauen.

                              Mal sehen, ob es das damit auch geht. Ich ergänze dass dann im Skript.

                              Gesendet von iPad mit Tapatalk

                              Adapter: Fritzbox, Unify Circuit
                              Skripte: dynamic hue, Bluetooth Scan, Multi-Ereignisliste

                              1 Antwort Letzte Antwort
                              0
                              • P Offline
                                P Offline
                                pix
                                schrieb am zuletzt editiert von
                                #65

                                Hallo,

                                hat sich schon was getan? Ist das Einlesen von Aktivitäten und Schlaf schon möglich?

                                measure (getactivity, getmeas, getintradayactivity, getworkouts)

                                Gruß

                                Pix

                                ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                1 Antwort Letzte Antwort
                                0
                                • S Offline
                                  S Offline
                                  stoffel67
                                  schrieb am zuletzt editiert von
                                  #66

                                  Hallo zusammen,

                                  mal ne Frage an alle die diese Schlafsensormatte haben… ;)

                                  Wie funktioniert die genau? hängt das Teil am Stromnetz?

                                  ist das permanent mit WLAN verbunden? (noch mehr "Strahlen" im SZ)

                                  Mein Adapter: JUNG/GIRA eNet-Adapter

                                  1 Antwort Letzte Antwort
                                  0
                                  • D Offline
                                    D Offline
                                    dtp
                                    schrieb am zuletzt editiert von
                                    #67

                                    @stoffel67:

                                    hängt das Teil am Stromnetz? `
                                    Ja.
                                    @stoffel67:

                                    ist das permanent mit WLAN verbunden? (noch mehr "Strahlen" im SZ) `
                                    Wir haben im Schlafzimmer seit einigen Jahren einen WLAN-Repeater und ein Android-Tablet als Wecker stehen. Seit kurzem kam nun noch ein Echo Spot hinzu. Da ist das WLAN des Nokia Sleep eher vernachlässigbar.

                                    Übrigens sendet Nokia Sleep meines Wissens nach die Daten nur einmalig nach dem Aufstehen. Kann gut sein, dass es daher nicht permanent mit dem WLAN verbunden ist.

                                    ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                                    1 Antwort Letzte Antwort
                                    0
                                    • D Offline
                                      D Offline
                                      dtp
                                      schrieb am zuletzt editiert von
                                      #68

                                      Oh man, Nokia. Was macht ihr da eigentlich gerade? Kauft vor zwei Jahren die Firma Withings auf, labelt alles auf Nokia um, entwickelt ein paar Geräte weiter, um nun das Ganze wieder zurück an einen der Withings-Gründer zu verkaufen. Fortan wird wieder alles unter dem Namen Withings verkauft. So sind meine Waage und mein Blutdruckmessgerät immerhin wieder aktuell. Aber ich hoffe doch inständig, dass auch der Nokia Sleep weiterhin unterstützt wird. Aber das wurde ja so angekündigt.

                                      Da ich es übrigens mit Umstieg auf die Pro-Cloud des ioBroker nunmehr geschafft habe, IFTTT einzubinden, ist das Skript nicht mehr ganz so wichtig. Trotzdem werde ich mich bei Gelegenheit mit Bezug auf den Nokia Sleep noch mal dran setzen. Aber nun muss ich meine Datenpunkte auch wieder auf Withings umbenennen, oder? 8-)

                                      ioBroker im Docker-Container auf Synology DiskStation DS718+, HomeMatic IP über CCU3, IKEA Dirigera inkl. Matter, Apple Homekit, Amazon Alexa.

                                      1 Antwort Letzte Antwort
                                      0
                                      • P Offline
                                        P Offline
                                        pix
                                        schrieb am zuletzt editiert von
                                        #69

                                        Hallo,

                                        soeben hat Wihtings / Nokia (wie auch immer :lol: ) per Mail angekündigt, die API zu modernisieren. Ich zitiere aus Bequemlichkeit die Email:
                                        @Nokia Email:

                                        CLOSING THE OAUTH 1.0 AUTHENTICATION

                                        The Health Mate API is now fully functional with OAuth 2.0 authentication protocol. Therefore, the OAuth 1.0 process will no longer be supported beginning November 30, 2018.

                                        WHY ARE WE MAKING THIS CHANGE?

                                        When the Health Mate API was first developed, we implemented the OAuth 1.0 process to ensure authentication. Because the OAuth 2.0 protocol is now available and easier to use, we have decided to improve our API by integrating the OAuth 2.0 authentication protocol.

                                        WILL NOKIA HEALTH WEB SERVICES CHANGE?

                                        If you update to our new process outlined in this email, the Health Mate API will provide the same web services for retrieving user information and measures.

                                        WHAT DO YOU NEED TO DO?

                                        You must integrate the OAuth 2.0 authentication process and transform your current OAuth 1.0 tokens into OAuth 2.0 tokens. You must then use those new tokens in every call to our API.

                                        For more information, please refer to the new documentation, which replaces the previous version. See the new documentation

                                        OTHER SECURITY CHANGES

                                        1. NOTIFICATION CALLBACK URLS VERIFICATION

                                        We have implemented new rules regarding notify callback URLs to improve security. Subscriptions with an invalid callback URL will be deleted November 30, 2018. Please note that:

                                        HTTPS is now required

                                        If you specify a port, you must only use 443

                                        The URL must not contain an IP

                                        The use of localhost is no longer allowed

                                        If your notifications do not follow these new rules, please refer to the Notify section of our documentation to learn how to make changes.

                                        2. OAUTH 2.0 CALLBACK URL VERIFICATION

                                        As of November 2018, the OAuth 2.0 workflow will only accept redirect URLs in HTTPS. You can edit to redirect your URL in the OAuth 2.0 dashboard.

                                        3. HTTPS REQUIRED WITH SNI AND TLS 1.2

                                        HTTPS with the SNI (Server Name Indication) extension will be required as of November 2018. HTTP calls will be rejected.

                                        You must use a client that supports TLS 1.2. To follow industry standards, including those provided by NIST and PCI-DSS, we will drop support for TLS versions 1.0 and 1.1 beginning November 30, 2018.

                                        NEW DOCUMENTATION

                                        The new official documentation is available at:

                                        https://developer.health.nokia.com

                                        QUESTIONS?

                                        If you still have questions, don’t hesitate to reach out to us at:

                                        partner-api@withings.com

                                        Thank you,

                                        The Health Mate API Team `

                                        Vielleicht kriegen wir das Skript dann endlich zum Laufen. :roll:

                                        Gruß

                                        Pix

                                        ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                                        1 Antwort Letzte Antwort
                                        0
                                        • Q Offline
                                          Q Offline
                                          quersumme
                                          schrieb am zuletzt editiert von
                                          #70

                                          Ist jemand an der Implementierung der neuen Withings-API dran?

                                          Ich hab versucht bisschen was zu basteln, aber da ich keine Ahnung von oauth habe, bin ich schon sehr früh gescheitert. :?

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          648

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Home
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe