UNPKG

iobroker.solarwetter

Version:
223 lines (201 loc) 9.83 kB
const adapterName = require('./package.json').name.split('.').pop(); const utils = require('@iobroker/adapter-core'); // Get common adapter utils const axios = require('axios'); let plz; let city; let power; let stopTimeout; let adapter; /* removed username & password 2022/03 */ const logging = false; const idClearSky = 'forecast.clearSky'; const idRealSkyMin = 'forecast.realSky_min'; const idRealSkyMax = 'forecast.realSky_max'; const idDatum = 'forecast.Datum'; const idPLZ = 'forecast.Region'; const idPrognose = 'forecast.chart.city'; const idPrognoseURL = 'forecast.chart.url'; const idHomeAnlage = 'forecast.home.Leistung'; const idHomeClearSky = 'forecast.home.clearSky'; const idHomeRealSkyMin = 'forecast.home.realSky_min'; const idHomeRealSkyMax = 'forecast.home.realSky_max'; function startAdapter(options) { options = options || {}; Object.assign(options, { name: adapterName, ready: () => main(), unload: callback => { stopTimeout && clearTimeout(stopTimeout); stopTimeout = null; callback && callback(); }, }); adapter = new utils.Adapter(options); return adapter; } function readSettings() { plz = adapter.config.location; if (plz === undefined || plz === 0 || plz === 'select') { adapter.log.warn('Keine Region ausgewählt'); // Translate! adapter.stop(); } else { adapter.log.info(`Postcode: ${plz}`); adapter.setState(idPLZ, plz, true); } city = adapter.config.prognoseort; if (!city || city.search(/(- )\b\b/gmi) !== -1) { adapter.log.warn('Keine Stadt für eine 4-Tage-Prognose ausgewählt'); // Translate! adapter.stop(); } else { adapter.log.info(`4-Tage-Prognose für: ${city}`); adapter.setState(idPrognose, city, true); adapter.setState(idPrognoseURL, `http://www.solar-wetter.com/assets/${city}%20Vorhersage-Diagramm.GIF`, true); adapter.log.debug(`URL für Bild: http://www.solar-wetter.com/assets/${city}%20Vorhersage-Diagramm.GIF`); } power = parseFloat(adapter.config.power); if (!power) { adapter.log.warn('Keine Leistung für die eigene Anlage angegeben'); // Translate! power = 0; } else { adapter.log.info(`Leistung eigene Anlage: ${power} kWp`); } adapter.setState(idHomeAnlage, parseFloat(power), true); leseWebseite(); } function erstes_erstesAuftauchen(body, text1, text2) { const start = body.indexOf(text1) + text1.length; const ende = body.indexOf(text2); logging && adapter.log.debug(`Startposition: ${start}`); logging && adapter.log.debug(`Endposition: ${ende}`); let zwischenspeicher; if (start !== -1 && ende !== -1 && start < ende) { // Fehler abfangen zwischenspeicher = body.slice(start, ende); logging && adapter.log.debug(zwischenspeicher); const zwischenspeicher_array = zwischenspeicher.split(','); // Teilen vorm Komma const zwischenspeicher_array_vorn = zwischenspeicher_array[0].slice(zwischenspeicher_array[0].length - 1, zwischenspeicher_array[0].length); // eine Stelle vorm Komma logging && adapter.log.debug(zwischenspeicher_array_vorn); const zwischenspeicher_array_hinten = zwischenspeicher_array[1].slice(0, 2); // zwei Stellen nach dem Komma logging && adapter.log.debug(zwischenspeicher_array_hinten); return parseFloat(`${zwischenspeicher_array_vorn}.${zwischenspeicher_array_hinten}`); } zwischenspeicher = 'Fehler beim Ausschneiden'; adapter.log.error(zwischenspeicher); adapter.stop(); return 0; } function erstes_letztesAuftauchen(body, text1, text2) { const start = body.indexOf(text1) + text1.length; const ende = body.lastIndexOf(text2); // letztes Auftauchen logging && adapter.log.debug(`Startposition: ${start}`); logging && adapter.log.debug(`Endposition: ${ende}`); let zwischenspeicher; if (start !== -1 && ende !== -1 && start < ende) { // Fehler abfangen zwischenspeicher = body.slice(start, ende); logging && adapter.log.debug(zwischenspeicher); const zwischenspeicher_array = zwischenspeicher.split(','); // Teilen vorm Komma const zwischenspeicher_array_vorn = zwischenspeicher_array[0].slice(zwischenspeicher_array[0].length - 1, zwischenspeicher_array[0].length); // eine Stelle vorm Komma logging && adapter.log.debug(zwischenspeicher_array_vorn); const zwischenspeicher_array_hinten = zwischenspeicher_array[1].slice(0, 2); // zwei Stellen nach dem Komma logging && adapter.log.debug(zwischenspeicher_array_hinten); return parseFloat(`${zwischenspeicher_array_vorn}.${zwischenspeicher_array_hinten}`); } zwischenspeicher = 'Fehler beim Ausschneiden'; adapter.log.error(zwischenspeicher); adapter.stop(); return 0; } function loeseDatum(body, text1) { const start = body.indexOf(text1) - 5; const ende = body.indexOf(text1) + 5; // xx.xx.xxxx logging && adapter.log.debug(`Startposition: ${start}`); logging && adapter.log.debug(`Endposition: ${ende}`); let zwischenspeicher; if (start !== -1 && ende !== -1) { // Fehler abfangen zwischenspeicher = body.slice(start, ende); const datum_array = zwischenspeicher.split('.'); const xDatum = new Date(); logging && adapter.log.debug(`Tag: ${datum_array[0]}`); logging && adapter.log.debug(`Monat: ${datum_array[1]}`); logging && adapter.log.debug(`Jahr: ${datum_array[2]}`); xDatum.setDate(datum_array[0]); xDatum.setMonth(datum_array[1] - 1); xDatum.setFullYear(datum_array[2]); logging && adapter.log.debug(xDatum); // return(formatDate(xDatum, "TT.MM.JJJJ")); const xDatum_workaround = `${xDatum.getDate() < 10 ? `0${xDatum.getDate()}` : xDatum.getDate()}.${xDatum.getMonth() + 1 < 10 ? `0${xDatum.getMonth() + 1}` : xDatum.getMonth() + 1}.${xDatum.getFullYear()}`; return xDatum_workaround; } zwischenspeicher = 'Fehler beim Ausschneiden'; adapter.log.error(zwischenspeicher); adapter.stop(); return null; } function findeWertClearsky (body) { const text1 = "<td height=17 class=xl1525883 style='height:12.75pt'>clear sky:</td>"; // erstes Auftauchen const text2 = '<td class=xl6525883>kWh/kWp</td>'; // erstes Auftauchen const clearSky = erstes_erstesAuftauchen(body, text1, text2); logging && adapter.log.debug(`ClearSky: ${clearSky}`); adapter.setState(idClearSky, {ack: true, val: clearSky}); // Wert in Objekt schreiben adapter.setState(idHomeClearSky, {ack: true, val: clearSky * power}); // Wert in Objekt schreiben } function findeWertRealskyMinimum (body) { const text1 = 'real sky:</td>'; // erstes Auftauchen const text2 = '<td class=xl6825883>-</td>'; // erstes Auftauchen const realsky_min = erstes_erstesAuftauchen(body,text1,text2); logging && adapter.log.debug(`RealSkyMinimum: ${realsky_min}`); adapter.setState(idRealSkyMin, {ack: true, val: realsky_min}); // Wert in Objekt schreiben adapter.setState(idHomeRealSkyMin, {ack: true, val: realsky_min * power}); // Wert in Objekt schreiben } function findeWertRealskyMaximum (body) { const text1 = '<td class=xl6825883>-</td>'; // erstes Auftauchen const text2 = '<td class=xl6525883>kWh/kWp</td>'; // letztes Auftauchen const realsky_max = erstes_letztesAuftauchen(body,text1,text2); logging && adapter.log.debug(`RealSkyMaximum: ${realsky_max}`); adapter.setState(idRealSkyMax, {ack: true, val: realsky_max}); // Wert in Objekt schreiben adapter.setState(idHomeRealSkyMax, {ack: true, val: realsky_max * power}); // Wert in Objekt schreiben } function findeDatum(body) { const jetzt = new Date(); const Jahr = jetzt.getFullYear(); // aktuelles Jahr ermitteln const text1 = `.${Jahr}</td>`; // erstes Auftauchen vom aktuellen Jahr finden const datum = loeseDatum(body, text1); logging && adapter.log.debug(`Datum: ${datum}`); adapter.setState(idDatum, {ack: true, val: datum}); // Wert in Objekt schreiben } function leseWebseite () { const link = `http://www.vorhersage-plz-bereich.solar-wetter.com/html/${plz}.htm`; logging && adapter.log.debug(`link to be retrieved: ${link}`); if (!plz || plz.length < 3) { adapter.log.warn('Kein PLZ-Bereich festgelegt. Adapter wird angehalten'); adapter.stop(); } try { axios(link) .then(response => { const body = response.data; findeWertClearsky(body); findeWertRealskyMinimum(body); findeWertRealskyMaximum(body); findeDatum(body); }) .catch(error => adapter.log.error(error)); } catch (e) { adapter.log.error(`Fehler (try) leseWebseite: ${e}`); } } function main() { readSettings(); adapter.log.info('objects written'); stopTimeout = setTimeout(() => { adapter.log.info('force terminating adapter after 1 minute'); adapter.stop(); }, 60000); } // If started as allInOne mode => return function to create instance // @ts-ignore if (module.parent) { module.exports = startAdapter; } else { // or start the instance directly startAdapter(); }