NEWS
Ecowitt GW2000 MQTT Problem
-
Hallo zusammen,
Habe ein GW2000 mit WS90, und versuche Daten an meinen MQTT Broker zu senden (ikobroker Adapter)
Es kommt aber nur die ID an, keine Daten

Hier das Webinterface des GW2000:

Hat jemand eine Idee, woran das liegen kann?
@endurance
Habs herausgefunden, daten stecken alle in einem Objekt....
Habs mit dem folgenden Skript auseinandergenommen:// === Einstellungen === const MQTT_STATE = 'mqtt.0.ecowitt.3C8A1F2A63C7'; // <- DEINE State-ID hier eintragen const BASE = '0_userdata.0.ecowitt.'; // Zielordner // === Hilfsfunktionen === function toNumber(x) { const n = Number(x); return isFinite(n) ? n : null; } function f2c(f){ const n = toNumber(f); return n==null ? null : (n-32)*5/9; } function inHg2hPa(h){ const n = toNumber(h); return n==null ? null : n*33.8638866667; } function mph2ms(m){ const n = toNumber(m); return n==null ? null : m*0.44704; } function inch2mm(i){ const n = toNumber(i); return n==null ? null : i*25.4; } // Einfacher Querystring‑Parser (ohne URLSearchParams) function parseQuery(q) { const out = {}; if (typeof q !== 'string' || !q) return out; // WU-Style: '+' = Leerzeichen q = q.replace(/\+/g, ' '); // Teile erst an & und dekodiere dann key/value q.split('&').forEach(pair => { const idx = pair.indexOf('='); let k, v; if (idx >= 0) { k = decodeURIComponent(pair.slice(0, idx)); v = decodeURIComponent(pair.slice(idx + 1)); } else { k = decodeURIComponent(pair); v = ''; } if (k) out[k] = v; }); return out; } // State-Schreiber (legt State an, falls nicht vorhanden) async function put(id, val, unit='', type='number') { const full = BASE + id; if (!await existsStateAsync(full)) { await setObjectAsync(full, {type: 'state', common: {name: id, read: true, write: false, type, role: 'value', unit}, native: {}}); } setState(full, val, true); } // === Subscriber: jedes Update parsen === on({ id: MQTT_STATE, change: 'any' }, async obj => { try { if (!obj || !obj.state || typeof obj.state.val !== 'string') return; const params = parseQuery(obj.state.val); // Meta await put('meta.stationtype', params.stationtype || '', '', 'string'); await put('meta.model', params.model || '', '', 'string'); await put('meta.dateutc', params.dateutc || '', '', 'string'); await put('meta.interval', toNumber(params.interval)); // Innen await put('inside.temp_C', f2c(params.tempinf), '°C'); await put('inside.humidity_pct', toNumber(params.humidityin), '%'); await put('pressure.rel_hPa', inHg2hPa(params.baromrelin), 'hPa'); await put('pressure.abs_hPa', inHg2hPa(params.baromabsin), 'hPa'); // Außen await put('outside.temp_C', f2c(params.tempf), '°C'); await put('outside.humidity_pct', toNumber(params.humidity), '%'); await put('outside.vpd_kPa', toNumber(params.vpd), 'kPa'); // Wind await put('wind.dir_deg', toNumber(params.winddir), '°'); await put('wind.dir_avg10m_deg', toNumber(params.winddir_avg10m), '°'); await put('wind.speed_ms', mph2ms(params.windspeedmph), 'm/s'); await put('wind.gust_ms', mph2ms(params.windgustmph), 'm/s'); await put('wind.maxdailygust_ms', mph2ms(params.maxdailygust), 'm/s'); // Solar/UV await put('solar.radiation_Wm2', toNumber(params.solarradiation), 'W/m²'); await put('uv.index', toNumber(params.uv)); // Regen (Zoll -> mm) await put('rain.rate_mmph', inch2mm(params.rrain_piezo), 'mm/h'); await put('rain.event_mm', inch2mm(params.erain_piezo), 'mm'); await put('rain.hour_mm', inch2mm(params.hrain_piezo), 'mm'); await put('rain.day_mm', inch2mm(params.drain_piezo), 'mm'); await put('rain.week_mm', inch2mm(params.wrain_piezo), 'mm'); await put('rain.month_mm', inch2mm(params.mrain_piezo), 'mm'); await put('rain.year_mm', inch2mm(params.yrain_piezo), 'mm'); // Batteries / Misc (Wittboy) await put('wittboy.cap_volt', toNumber(params.ws90cap_volt), 'V'); await put('wittboy.version', toNumber(params.ws90_ver)); await put('wittboy.batt_V', toNumber(params.wh90batt), 'V'); // Rohdaten ablegen (optional, hilfreich zum Debuggen) await put('raw.query', obj.state.val, '', 'string'); } catch (e) { log(`Ecowitt parse error: ${e}`, 'error'); } });
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden