NEWS
HUUM Saunasteuerung
-
Hallo, ich bin neu hier und habe eine Frage / Bitte..
Ich würde gerne meine Saunasteuerung in iobroker integrieren. Die Steuerung ist per API ansprechbar. In Nodered hatte ich es auch schonmal geschafft per Get Befehl geschafft. Nun will ich aber auf iobroker umsteigen. Ich vermute es geht nur per Skript - aber ich komme damit nicht zurecht.
Kann mir jemand helfen? Hier die Infos zur API https://github.com/horemansp/HUUM
Vielen Dank!
-
@ckossendey Das wäre der erste Schritt :
im Javascript Adapter unter zusätzlich NPM Module 'axios' eintragenusername und passwort ins Script eintragen . Dann sollte schonmal ein JSON String zurück kommen
const axios = require('axios'); const url = 'https://api.huum.eu/action/home/status'; async function getHuum () { const err = await axios .get(url, { auth: { username: 'foo', password: 'baz' } }) .then (function(response) { console.log(response.data); }) .catch(function(error) { console.log('Error '+error); }); } getHuum ();
-
Danke dir! Ich habe es ein wenig umgebaut und nun bekomme ich die Werte auch schon als Objekte angezeigt. Hier mein Code:
'*/10 * * * *' "use strict" const axios = require('axios'); const url = 'https://api.huum.eu/action/home/status'; createState("huum.maxHeatingTime") createState("huum.statusCode") createState("huum.door") createState("huum.config") createState("huum.light") createState("huum.temperature") createState("huum.date") axios.get(url, { auth: { username: 'user', password: 'pass' } }) .then (function(response) { console.log(response.data); // console.log(response.data.statusCode); // console.log(response.data.config); // console.log(response.data.light); // console.log(response.data.paymentEndDate); // console.log(response.data.temperature); setState("huum.maxHeatingTime", response.data.maxHeatingTime); setState("huum.statusCode", response.data.statusCode); setState("huum.door", response.data.door); setState("huum.config", response.data.config); setState("huum.light", response.data.light); setState("huum.temperature", response.data.temperature); setState("huum.date", response.headers.date); }) .catch(function(error) { console.log('Error '+error); });
ISt das grundsätzlich in Ordnung so? Danke
-
@ckossendey Damit die Funktion periodisch aufgefufen wird braucht es noch ein Schedule. Außerdem sollten Userdata unter '0_userdata.0' gespeichert werden und bei createState Rolle und Typ angeben.
"use strict" const axios = require('axios'); const url = 'https://api.huum.eu/action/home/status'; const mySchedule = '*/10 * * * *'; createState("huum.maxHeatingTime") createState("huum.statusCode") createState("huum.door") createState("huum.config") createState("huum.light") createState("huum.temperature") createState("huum.date") function getHuum () { axios.get(url, { auth: { username: 'user', password: 'pass' } }) .then (function(response) { console.log(response.data); // console.log(response.data.statusCode); // console.log(response.data.config); // console.log(response.data.light); // console.log(response.data.paymentEndDate); // console.log(response.data.temperature); setState("huum.maxHeatingTime", response.data.maxHeatingTime); setState("huum.statusCode", response.data.statusCode); setState("huum.door", response.data.door); setState("huum.config", response.data.config); setState("huum.light", response.data.light); setState("huum.temperature", response.data.temperature); setState("huum.date", response.headers.date); }) .catch(function(error) { console.log('Error '+error); }); }; schedule(mySchedule, function () { // wird alle 10 min. ausgelöst getHuum(); });
-
@gargano Danke! ich hab das mal umgesetzt!
Nun noch eine Frage zum Post Befehl, ich habe das ganze wie unten aufgesetzt - bekomme aber immer die Meldung: data: 'Please enter username and password'
Kannst du dir das erklären?
"use strict" let temperature temperature = "50"; const axios = require('axios'); const urlstart = "https://api.huum.eu/action/home/start"; axios.post(urlstart, {auth: {username: 'user', password: 'pass' }, params: {targetTemperature: temperature} }) .then(function (response) { console.log(response.data); }) .catch(function (error) { console.log(error); });
Den get Befehl habe ich wie folgt umgebaut:
"use strict" const axios = require('axios'); const url = 'https://api.huum.eu/action/home/status'; const mySchedule = '*/5 * * * *'; createState("0_userdata.0.huum.maxHeatingTime" ,false) createState("0_userdata.0.huumstatusCode", false) createState("0_userdata.0.huum.door", false) createState("0_userdata.0.huum.config", false) createState("0_userdata.0.huum.light", false) createState("0_userdata.0.huum.temperature", false) createState("0_userdata.0.huum.date", false) function getHuum () { axios.get(url, { auth: { username: 'user', password: 'pass' } }) .then (function(response) { console.log(response.data); // console.log(response.data.statusCode); // console.log(response.data.config); // console.log(response.data.light); // console.log(response.data.paymentEndDate); // console.log(response.data.temperature); setState("0_userdata.0.huum.maxHeatingTime", response.data.maxHeatingTime); setState("0_userdata.0.huum.statusCode", response.data.statusCode); setState("0_userdata.0.huum.door", response.data.door); setState("0_userdata.0.huum.config", response.data.config); setState("0_userdata.0.huum.light", response.data.light); setState("0_userdata.0.huum.temperature", response.data.temperature); setState("0_userdata.0.huum.date", response.headers.date); }) .catch(function(error) { console.log('Error '+error); }); }; getHuum();
-
@ckossendey sagte in HUUM Saunasteuerung:
Versuch mal
Username und Passwort stimmt ?"use strict" let temperature temperature = "50"; let data = {targetTemperature: temperature}; const axios = require('axios'); const urlstart = "https://api.huum.eu/action/home/start"; axios.post(urlstart,data, {auth: {username: 'user', password: 'pass' } }) .then(function (response) { console.log(response.data); }) .catch(function (error) { console.log(error); });
-
ohne den Parameter "?targetTemperature=80" bzw. die url "api.huum.eu/action/home/start?targetTemperature=80"
klappt es nicht - kann die übergabe der Temperatur als "Parameter" funktionieren?
Danke
-
@ckossendey der Hersteller hatte mir diesen Aufruf empfohlen:
curl --user username:password https://api.huum.eu/action/home/start -d targetTemperature=70 -v
-
@ckossendey Das ist das curl Kommando , funktioniert das denn ?
Der Unterschied zu dem axios ist nur das eine, daß die Temperature beim Curl ohne Hochkomma ist
Zeig mal den Log vrom Script
Auch kann es sein, daß die Sauna kein JSON versteht. In dem Fall müßte dann data so aussehen (in Anlehnung an dem Curl Befehl) :let data = 'targetTemperature='+temperature;
-
cko@MacBook-Pro HUUM % node posthuum.js Error: Request failed with status code 401 at createError (/Users/cko/Desktop/HUUM/node_modules/axios/lib/core/createError.js:16:15) at settle (/Users/cko/Desktop/HUUM/node_modules/axios/lib/core/settle.js:17:12) at IncomingMessage.handleStreamEnd (/Users/cko/Desktop/HUUM/node_modules/axios/lib/adapters/http.js:260:11) at IncomingMessage.emit (node:events:381:22) at endReadableNT (node:internal/streams/readable:1307:12) at processTicksAndRejections (node:internal/process/task_queues:81:21) { config: { url: 'https://api.huum.eu/action/home/start', method: 'post', data: '{"auth":{"username":"user","password":"pass"},"params":{"targetTemperature":"50"}}', headers: { Accept: 'application/json, text/plain, */*', 'Content-Type': 'application/json;charset=utf-8', 'User-Agent': 'axios/0.21.1', 'Content-Length': 103 }, transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse] ], timeout: 0, adapter: [Function: httpAdapter], xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, validateStatus: [Function: validateStatus] }, request: <ref *1> ClientRequest { _events: [Object: null prototype] { abort: [Function (anonymous)], aborted: [Function (anonymous)], connect: [Function (anonymous)], error: [Function (anonymous)], socket: [Function (anonymous)], timeout: [Function (anonymous)], prefinish: [Function: requestOnPrefinish] }, _eventsCount: 7, _maxListeners: undefined, outputData: [], outputSize: 0, writable: true, destroyed: false, _last: true, chunkedEncoding: false, shouldKeepAlive: false, _defaultKeepAlive: true, useChunkedEncodingByDefault: true, sendDate: false, _removedConnection: false, _removedContLen: false, _removedTE: false, _contentLength: null, _hasBody: true, _trailer: '', finished: true, _headerSent: true, _closed: false, socket: TLSSocket { _tlsOptions: [Object], _secureEstablished: true, _securePending: false, _newSessionPending: false, _controlReleased: true, secureConnecting: false, _SNICallback: null, servername: 'api.huum.eu', alpnProtocol: false, authorized: true, authorizationError: null, encrypted: true, _events: [Object: null prototype], _eventsCount: 10, connecting: false, _hadError: false, _parent: null, _host: 'api.huum.eu', _readableState: [ReadableState], _maxListeners: undefined, _writableState: [WritableState], allowHalfOpen: false, _sockname: null, _pendingData: null, _pendingEncoding: '', server: undefined, _server: null, ssl: [TLSWrap], _requestCert: true, _rejectUnauthorized: true, parser: null, _httpMessage: [Circular *1], [Symbol(res)]: [TLSWrap], [Symbol(verified)]: true, [Symbol(pendingSession)]: null, [Symbol(async_id_symbol)]: 3, [Symbol(kHandle)]: [TLSWrap], [Symbol(kSetNoDelay)]: false, [Symbol(lastWriteQueueSize)]: 0, [Symbol(timeout)]: null, [Symbol(kBuffer)]: null, [Symbol(kBufferCb)]: null, [Symbol(kBufferGen)]: null, [Symbol(kCapture)]: false, [Symbol(kBytesRead)]: 0, [Symbol(kBytesWritten)]: 0, [Symbol(connect-options)]: [Object], [Symbol(RequestTimeout)]: undefined }, _header: 'POST /action/home/start HTTP/1.1\r\n' + 'Accept: application/json, text/plain, */*\r\n' + 'Content-Type: application/json;charset=utf-8\r\n' + 'User-Agent: axios/0.21.1\r\n' + 'Content-Length: 103\r\n' + 'Host: api.huum.eu\r\n' + 'Connection: close\r\n' + '\r\n', _keepAliveTimeout: 0, _onPendingData: {}, agent: Agent { _events: [Object: null prototype], _eventsCount: 2, _maxListeners: undefined, defaultPort: 443, protocol: 'https:', options: [Object], requests: {}, sockets: [Object], freeSockets: {}, keepAliveMsecs: 1000, keepAlive: false, maxSockets: Infinity, maxFreeSockets: 256, scheduling: 'lifo', maxTotalSockets: Infinity, totalSocketCount: 1, maxCachedSessions: 100, _sessionCache: [Object], [Symbol(kCapture)]: false }, socketPath: undefined, method: 'POST', maxHeaderSize: undefined, insecureHTTPParser: undefined, path: '/action/home/start', _ended: true, res: IncomingMessage { _readableState: [ReadableState], _events: [Object: null prototype], _eventsCount: 3, _maxListeners: undefined, socket: [TLSSocket], httpVersionMajor: 1, httpVersionMinor: 1, httpVersion: '1.1', complete: true, rawHeaders: [Array], rawTrailers: [], aborted: false, upgrade: false, url: '', method: null, statusCode: 401, statusMessage: 'Unauthorized', client: [TLSSocket], _consuming: false, _dumped: false, req: [Circular *1], responseUrl: 'https://api.huum.eu/action/home/start', redirects: [], [Symbol(kCapture)]: false, [Symbol(kHeaders)]: [Object], [Symbol(kHeadersCount)]: 16, [Symbol(kTrailers)]: null, [Symbol(kTrailersCount)]: 0, [Symbol(RequestTimeout)]: undefined }, aborted: false, timeoutCb: null, upgradeOrConnect: false, parser: null, maxHeadersCount: null, reusedSocket: false, host: 'api.huum.eu', protocol: 'https:', _redirectable: Writable { _writableState: [WritableState], _events: [Object: null prototype], _eventsCount: 2, _maxListeners: undefined, _options: [Object], _ended: true, _ending: true, _redirectCount: 0, _redirects: [], _requestBodyLength: 103, _requestBodyBuffers: [], _onNativeResponse: [Function (anonymous)], _currentRequest: [Circular *1], _currentUrl: 'https://api.huum.eu/action/home/start', [Symbol(kCapture)]: false }, [Symbol(kCapture)]: false, [Symbol(kNeedDrain)]: false, [Symbol(corked)]: 0, [Symbol(kOutHeaders)]: [Object: null prototype] { accept: [Array], 'content-type': [Array], 'user-agent': [Array], 'content-length': [Array], host: [Array] } }, response: { status: 401, statusText: 'Unauthorized', headers: { server: 'nginx', date: 'Mon, 12 Apr 2021 12:54:40 GMT', 'content-type': 'text/html; charset=UTF-8', 'transfer-encoding': 'chunked', connection: 'close', 'x-powered-by': 'PHP/7.4.15', 'access-control-allow-origin': '*', 'www-authenticate': 'Basic realm="HUUM api"' }, config: { url: 'https://api.huum.eu/action/home/start', method: 'post', data: '{"auth":{"username":"user","password":"pass"},"params":{"targetTemperature":"50"}}', headers: [Object], transformRequest: [Array], transformResponse: [Array], timeout: 0, adapter: [Function: httpAdapter], xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, validateStatus: [Function: validateStatus] }, request: <ref *1> ClientRequest { _events: [Object: null prototype], _eventsCount: 7, _maxListeners: undefined, outputData: [], outputSize: 0, writable: true, destroyed: false, _last: true, chunkedEncoding: false, shouldKeepAlive: false, _defaultKeepAlive: true, useChunkedEncodingByDefault: true, sendDate: false, _removedConnection: false, _removedContLen: false, _removedTE: false, _contentLength: null, _hasBody: true, _trailer: '', finished: true, _headerSent: true, _closed: false, socket: [TLSSocket], _header: 'POST /action/home/start HTTP/1.1\r\n' + 'Accept: application/json, text/plain, */*\r\n' + 'Content-Type: application/json;charset=utf-8\r\n' + 'User-Agent: axios/0.21.1\r\n' + 'Content-Length: 103\r\n' + 'Host: api.huum.eu\r\n' + 'Connection: close\r\n' + '\r\n', _keepAliveTimeout: 0, _onPendingData: {}, agent: [Agent], socketPath: undefined, method: 'POST', maxHeaderSize: undefined, insecureHTTPParser: undefined, path: '/action/home/start', _ended: true, res: [IncomingMessage], aborted: false, timeoutCb: null, upgradeOrConnect: false, parser: null, maxHeadersCount: null, reusedSocket: false, host: 'api.huum.eu', protocol: 'https:', _redirectable: [Writable], [Symbol(kCapture)]: false, [Symbol(kNeedDrain)]: false, [Symbol(corked)]: 0, [Symbol(kOutHeaders)]: [Object: null prototype] }, data: 'Please enter username and password' }, isAxiosError: true, toJSON: [Function: toJSON] } cko@MacBook-Pro HUUM %
-
@ckossendey sagte in HUUM Saunasteuerung:
statusCode: 401,
statusMessage: 'Unauthorized',stimmt denn Dein Passwort und Username ?
-
ja, die stimmen mit dem curl befehl im terminal klappt es auch mit den gleichen zugangsdaten. Kann man auch per javascript den curl request machen?
Danke!
-
@ckossendey
Das ist jetzt die 1 zu1 Übersetzung des curl Befehls"use strict" let temperature temperature = 50; let data = 'targetTemperature='+ temperature; const axios = require('axios'); const urlstart = "https://api.huum.eu/action/home/start"; axios.post(urlstart,data, {auth: {username: 'user', password: 'pass' } }) .then(function (response) { console.log(response.data); }) .catch(function (error) { console.log(error); });
-