NEWS
Ostrom Api auslesen
-
Hallo,
da ich nirgends was passendes gefunden habe bin ich gerade dabei, mir ein Skript zum Auslesen der Verbrauchsdaten von meinem dynamischen Tarif meines Stromanbieters Ostrom abzufragen. Das ganze ist noch eine sehr frühe Version und ich arbeite noch dran, vermutlich werde ich das skript hier auch noch aktualisieren.
Was aktuell geht:
- Monatliche Verbräche abfragen des aktuellen Jahres
- Tägliche Verbrauchsdaten des aktuellen Monats
nur eine kleiner Schritt den ich noch gehen möchte: Stündliche Verbrauchsdaten des aktuellen Tages (bzw des gestrigen, der heutige geht noch nicht)
Bin gespannt ob das hier noch jemanden interessiert, kann dann auch gern bei der Einrichtung helfen, auch wenn es mein erstes Skript mit Javaskript ist (ja ich hatte Hilfe von CHatGPT um mir ein Grundgerüst hinzustellen), verwende sonst eher Blockly oder außerhalb von iobroker Python.
Bin auch gespannt auf Verbesserungsvorschlägeconst axios = require('axios'); const clientId = getState('javascript.0.ostrom.client_id').val; const clientSecret = getState('javascript.0.ostrom.client_secret').val; const contractNumber = getState('javascript.0.ostrom.contract_number').val; async function getToken() { try { const authHeader = 'Basic ' + Buffer.from(`${clientId}:${clientSecret}`).toString('base64'); const response = await axios.post( 'https://auth.production.ostrom-api.io/oauth2/token', 'grant_type=client_credentials', { headers: { 'Authorization': authHeader, 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'application/json' } } ); return response.data.access_token; } catch (err) { console.error('❌ Fehler bei getToken: ' + (err.response ? err.response.status + ' ' + JSON.stringify(err.response.data) : err.message)); return null; } } async function getConsumption(token) { try { const response = await axios.get(`https://api.ostrom.de/contracts/${contractNumber}/consumption`, { headers: { Authorization: `Bearer ${token}` } }); return response.data; } catch (err) { console.error('❌ Fehler bei getConsumption:'); return []; } } async function updateConsumption_monthly() { try { const token = await getToken(); if (!token) { console.error('❌ Zugriffstoken konnte nicht abgerufen werden'); return; } const contractId = contractNumber const startDate = new Date(Date.UTC(new Date().getFullYear(), 0, 1)).toISOString(); const endDate = new Date(Date.UTC(new Date().getFullYear(), new Date().getMonth() + 1, 0)).toISOString(); const response = await axios.get( `https://production.ostrom-api.io/contracts/${contractId}/energy-consumption`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' }, params: { startDate, endDate, resolution: 'MONTH' } } ); const consumptionData = response.data.data; if (!consumptionData || consumptionData.length === 0) { console.warn('⚠️ Keine Verbrauchsdaten verfügbar'); return; } for (const item of consumptionData) { const date = new Date(item.date); const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const key = `javascript.0.ostrom.consumption_monthly.${year}_${month}`; const value = item.kWh || 0; await createStateAsync(key, value, { type: 'number', read: true, write: false }); await setStateAsync(key, value, true); } console.log('✅ monthly Verbrauchsdaten erfolgreich aktualisiert'); } catch (err) { console.error('❌ Fehler bei updateConsumption:' +(err.response ? err.response.status + ' ' + JSON.stringify(err.response.data) : err.message)); } } async function updateConsumption_daily() { try { const token = await getToken(); if (!token) { console.error('❌ Zugriffstoken konnte nicht abgerufen werden'); return; } const contractId = contractNumber const jetzt = new Date(); //const startDate = new Date(Date.UTC(jetzt.getUTCFullYear(), jetzt.getUTCMonth(), jetzt.getUTCDate())); //const endDate = new Date(Date.UTC(jetzt.getUTCFullYear(), jetzt.getUTCMonth(), jetzt.getUTCDate()+1)); const startDate = new Date(Date.UTC(new Date().getFullYear(), new Date().getMonth(), 1)).toISOString(); const endDate = new Date(Date.UTC(new Date().getFullYear(), new Date().getMonth(), jetzt.getUTCDate())).toISOString(); const response = await axios.get( `https://production.ostrom-api.io/contracts/${contractId}/energy-consumption`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' }, params: { startDate, endDate, resolution: 'DAY' } } ); const consumptionData = response.data.data; if (!consumptionData || consumptionData.length === 0) { console.warn('⚠️ Keine Verbrauchsdaten verfügbar'); return; } for (const item of consumptionData) { const date = new Date(item.date); const year = date.getFullYear(); const month = (date.getMonth() + 1).toString().padStart(2, '0'); const day = date.getDate().toString().padStart(2, '0'); const key = `javascript.0.ostrom.consumption_daily.${year}.${month}.${day}`; const value = item.kWh || 0; await createStateAsync(key, value, { type: 'number', read: true, write: false }); await setStateAsync(key, value, true); } console.log('✅ daily Verbrauchsdaten erfolgreich aktualisiert'); } catch (err) { console.error('❌ Fehler bei updateConsumption:' +(err.response ? err.response.status + ' ' + JSON.stringify(err.response.data) : err.message)); } } // Hilfsfunktion für async createState function createStateAsync(id, value, options) { return new Promise(resolve => { if (!existsState(id)) { createState(id, value, options, () => resolve()); } else { resolve(); } }); } updateConsumption_monthly(); updateConsumption_daily(); // Manueller Trigger on({ id: 'javascript.0.ostrom.update', val: true, ack: false }, async () => { await updateConsumption_monthly(); await updateConsumption_daily(); // Reset Trigger setState('javascript.0.ostrom.update', false, true); }); //Monthly täglich updaten setInterval(updateConsumption_monthly, 24 * 60 * 60 * 1000); setInterval(updateConsumption_daily, 24 * 60 * 60 * 1000);
-