NEWS
Regex liefert falschen Wert
-
const regex = /"total_power":(-?\d+(\.\d+)?)/gm; /* , entfernt */ .... let m; m = regex.exec(str) /* m ist ja "total_power":-43.36 */ P = m.split(':')[1] ....
-
Error in callback: TypeError: m.split is not a function
-
@ck_coke Dann muss man vorher noch aus m einen String machen.
m = String(m) P= m.split ......
-
let m; if ((m = regex.exec(str)) != null) log('Leistung: ' + m[1])
-
@ck_coke sagte in Regex liefert falschen Wert:
ich habe ein paar (Anfänger)-Schwierigkeiten mit einer Regex
Warum überhaupt JSON-Strings mit einem regex auseinander nehmen?!
-
Hier mal ein Beispiel-Script. Ohne exec, curl und regex
const server = 'https://shelly-67-eu.shelly.cloud'; const authKey = 'MTk3YjZhdWlkE6CD....'; const deviceId = 'b0b21c18d700'; httpPost(`${server}/device/status`, { id: deviceId, auth_key: authKey, }, (error, response) => { if (!error) { try { const obj = JSON.parse(response.data); // Daten extrahieren } catch (e) { console.error(e); } } else { console.error(error); } } );
Du suchst ja scheinbar:
obj.data.device_status.total_power
. -
Vielen Dank! So ist es natürlich noch besser gelöst.
-
Jetzt habe ich das Problem, dass es bei einem Gerät funktioniert und bei einem anderen
{"ack":true}
als Wert gesetzt wird.
So sieht das Skript aus:
schedule("*/10 * * * * *", function () { const server = 'https://shelly-89-eu.shelly.cloud'; const authKey = 'XjBjN2JjdWlkB12AE36D401E9C6EC6573933F664EA9B25923B90241D5720122CC428B82EF7477624E84B517133E2'; const deviceId = 'a0a3b3e7d67c'; httpPost(`${server}/device/status`, { id: deviceId, auth_key: authKey, }, (error, response) => { if (!error) { try { const obj = JSON.parse(response.data); // Daten extrahieren console.log(obj.data); setState('0_userdata.0.Leistung-Entladen', obj.data.device_status.voltage, true); } catch (e) { console.error(e); } } else { console.error(error); } } ); });
Folgendes bekomme ich im Log angezeigt:
javascript.0 2024-09-09 20:34:40.074 info script.js.common.Balkonkraftwerk.Skript_1: setForeignState(id=0_userdata.0.Leistung-Entladen, state={"val":{"ack":true},"ack":true,"ts":1725906880074,"q":0,"from":"system.adapter.javascript.0","lc":1725906880074,"c":"script.js.common.Balkonkraftwerk.Skript_1"}) javascript.0 2024-09-09 20:34:40.074 info script.js.common.Balkonkraftwerk.Skript_1: { online: true, device_status: { sys: { available_updates: [Object], mac: 'A0A3B3E7D67C', restart_required: false, time: '11:48', unixtime: 1725788939, uptime: 3, ram_size: 246876, ram_free: 134944, fs_size: 458752, fs_free: 122880, cfg_rev: 19, kvs_rev: 0, schedule_rev: 10, webhook_rev: 0, reset_reason: 1 }, ts: 1725906873.77, plugs_ui: {}, id: 'a0a3b3e7d67c', code: 'SNPL-00112EU', ws: { connected: false }, wifi: { sta_ip: '192.168.33.67', status: 'got ip', ssid: 'ShellyPlusPlugS-E465B8B3A57C', rssi: -29, ap_client_count: 0 }, mqtt: { connected: false }, serial: 3566, ffs: { ts: 0 }, 'switch:0': { id: 0, current: 0.021, source: 'SHC', output: true, apower: 0, voltage: 232.9, aenergy: [Object], temperature: [Object] }, cloud: { connected: true }, _updated: '2024-09-09 18:34:34', ble: {} } } javascript.0 2024-09-09 20:34:40.074 info script.js.common.Balkonkraftwerk.Skript_1: httpPost(url=https://shelly-89-eu.shelly.cloud/device/status, responseTime=66ms) javascript.0 2024-09-09 20:34:40.007 info script.js.common.Balkonkraftwerk.Skript_1: httpPost(config={"method":"post","url":"https://shelly-89-eu.shelly.cloud/device/status","responseType":"text","responseEncoding":"utf8","timeout":2000,"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0"},"data":{"id":"a0a3b3e7d67c","auth_key":"XjBjN2JjdWlkB12AE36D401E9C6EC6573933F664EA9B25923B90241D5720122CC428B82EF7477624E84B517133E2"}}, data=[object Object]) ```z
-
@ck_coke In deinem Scripts sind Klammerfehler. Das kann so gar nicht klappen. Da fehlt etwas.
voltage, true);
-
Das ist wohl beim hier ins Forum kopieren passiert.
Die Zeile sieht so aus:
setState('0_userdata.0.Leistung-Entladen', obj.data.device_status.voltage, true);
-
Kann es daran liegen das der Datenpunkt hinter switch:0, also eine Ebene tiefer liegt?
Zumindest habe ich das nach Internetrechersche in anderen Foren so gesehen.
-
@ck_coke sagte in Regex liefert falschen Wert:
Zumindest habe ich das nach Internetrechersche in anderen Foren so gesehen.
Ich hab das Thema JSON vs. Objekt in zig kostenlosen Inhalten super ausführlich erklärt.
Du musst schon den kompletten Pfad angeben. Im Falle von switch:0 muss das dann aber in eckige Klammern und kann nicht mit der einfachen Punkt-Notation erreicht werden.
obj.data.device_status['switch:0'].voltage