@hru hier ein script, du musst nur deine ip eintragen bzw ändern:
// =====================================
// my-PV AC ELWA 2 – Daten auslesen
// ioBroker JavaScript-Skript
// =====================================
// >>> HIER IP deiner ELWA eintragen <<<
const ELWA_IP = '192.168.178.145'; // aus deinem JSON: "cur_ip":"192.168.178.145"
// Abfrage-Intervall in Sekunden
const POLL_SECONDS = 10;
// Basis-Pfad der States
const base = 'mypv.acelwa2';
// ===============================
// States anlegen
// ===============================
createState(base + '.rawJson', '', {
name: 'Rohdaten JSON',
type: 'string',
role: 'json',
read: true,
write: true
});
// „einfache“ Temperatur / Leistung (für VIS usw.)
createState(base + '.temperature', 0, {
name: 'Speichertemperatur oben',
type: 'number',
role: 'value.temperature',
read: true,
write: true
});
createState(base + '.power', 0, {
name: 'Heizleistung ELWA',
type: 'number',
role: 'value.power',
read: true,
write: true
});
// Detail-States
createState(base + '.temperature_tank', 0, {
name: 'Speichertemperatur oben (temp2)',
type: 'number',
role: 'value.temperature',
read: true,
write: true
});
createState(base + '.temperature_inlet', 0, {
name: 'Temperatur unten / Zulauf (temp1)',
type: 'number',
role: 'value.temperature',
read: true,
write: true
});
createState(base + '.temperature_ps', 0, {
name: 'Elektronik-Temperatur (temp_ps)',
type: 'number',
role: 'value.temperature',
read: true,
write: true
});
createState(base + '.power_elwa2', 0, {
name: 'Heizleistung ELWA (power_elwa2)',
type: 'number',
role: 'value.power',
read: true,
write: true
});
createState(base + '.power_solar', 0, {
name: 'PV-Leistung (power_solar)',
type: 'number',
role: 'value.power',
read: true,
write: true
});
createState(base + '.power_grid', 0, {
name: 'Netzleistung (power_grid)',
type: 'number',
role: 'value.power',
read: true,
write: true
});
createState(base + '.surplus', 0, {
name: 'Überschussleistung (surplus)',
type: 'number',
role: 'value.power',
read: true,
write: true
});
createState(base + '.freq', 0, {
name: 'Netzfrequenz',
type: 'number',
role: 'value.frequency',
read: true,
write: true
});
createState(base + '.wifi_signal', 0, {
name: 'WLAN-Signalstärke',
type: 'number',
role: 'value',
read: true,
write: true
});
createState(base + '.ctrlstate', '', {
name: 'Status-Text (ctrlstate)',
type: 'string',
role: 'text',
read: true,
write: true
});
createState(base + '.date', '', {
name: 'Datum',
type: 'string',
role: 'date',
read: true,
write: true
});
createState(base + '.time', '', {
name: 'Uhrzeit',
type: 'string',
role: 'text',
read: true,
write: true
});
// ===============================
// Funktion: Daten holen
// ===============================
const http = require('http');
function fetchElwaData() {
const url = `http://${ELWA_IP}/data.jsn`;
log(`Hole Daten von ${url}`, 'debug');
http.get(url, (res) => {
let body = '';
res.on('data', (chunk) => {
body += chunk;
});
res.on('end', () => {
try {
const json = JSON.parse(body);
// Roh-JSON speichern
setState(base + '.rawJson', JSON.stringify(json), true);
// Zum Debuggen einmal ins Log
log('ELWA JSON: ' + JSON.stringify(json), 'debug');
// ===============================
// Werte umrechnen und mappen
// ===============================
// Temperaturen sind in Zehntel-Grad
const t_inlet = (json.temp1 != null) ? json.temp1 / 10 : null;
const t_tank = (json.temp2 != null) ? json.temp2 / 10 : null;
const t_ps = (json.temp_ps != null) ? json.temp_ps / 10 : null;
if (t_inlet !== null) {
setState(base + '.temperature_inlet', Number(t_inlet), true);
}
if (t_tank !== null) {
setState(base + '.temperature_tank', Number(t_tank), true);
// „Haupt-Temperatur“:
setState(base + '.temperature', Number(t_tank), true);
}
if (t_ps !== null) {
setState(base + '.temperature_ps', Number(t_ps), true);
}
// Leistungen (in Watt)
const p_elwa2 = json.power_elwa2 != null ? json.power_elwa2 : 0;
const p_solar = json.power_solar != null ? json.power_solar : 0;
const p_grid = json.power_grid != null ? json.power_grid : 0;
const surplus = json.surplus != null ? json.surplus : 0;
setState(base + '.power_elwa2', Number(p_elwa2), true);
setState(base + '.power_solar', Number(p_solar), true);
setState(base + '.power_grid', Number(p_grid), true);
setState(base + '.surplus', Number(surplus), true);
// „Haupt-Leistungs“-State:
setState(base + '.power', Number(p_elwa2), true);
// Netzfrequenz (49979 → 49.979 Hz)
if (json.freq != null) {
const freqHz = json.freq / 1000;
setState(base + '.freq', Number(freqHz), true);
}
// WLAN-Signal (0–3)
if (json.wifi_signal != null) {
setState(base + '.wifi_signal', Number(json.wifi_signal), true);
}
// Status-Text
if (json.ctrlstate != null) {
setState(base + '.ctrlstate', String(json.ctrlstate), true);
}
// Datum / Zeit
if (json.date != null) {
setState(base + '.date', String(json.date), true);
}
if (json.loctime != null) {
setState(base + '.time', String(json.loctime), true);
}
} catch (e) {
log('Fehler beim Auswerten der ELWA-Daten: ' + e, 'error');
}
});
}).on('error', (err) => {
log('Fehler beim HTTP-Aufruf der ELWA: ' + err, 'error');
});
}
// ===============================
// Zyklisches Polling
// ===============================
schedule(`*/${POLL_SECONDS} * * * * *`, fetchElwaData);
// Direkt beim Start einmal ausführen
fetchElwaData();