Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [Vorlage] Solaredge Wechselrichter

NEWS

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    16
    1
    1.9k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    913

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    25
    1
    2.2k

[Vorlage] Solaredge Wechselrichter

Geplant Angeheftet Gesperrt Verschoben JavaScript
9 Beiträge 5 Kommentatoren 28.2k Aufrufe 5 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • T Offline
    T Offline
    TobStar
    schrieb am zuletzt editiert von TobStar
    #1

    Hallo zusammen,

    nun läuft auch endlich unsere PV Anlage. Wir haben einen Solaredge Wechselrichter erhalten und der fertige Adapter scheint nicht mehr gepflegt zu werden, bzw. liest er mir auch zu wenige Daten aus. Daher habe ich mich an die API gemacht und ein Script dazu erstellt.

    Dieses findet Ihr in der aktuellsten Version auf GitHub unter https://github.com/GodHunter/iobroker-solaredge dort sind auch alle Informationen zur Einrichtung beschrieben.

    Da wir leider keinen Speicher im Einsatz haben, kann ich auf andere, relevante Daten leider nicht zurückgreifen. Falls jemand also einen Wechselrichter mit Speicher im Einsatz hat, würde ich mich über einen API Key freuen um diese Daten ebenfalls ins Script einfließen zu lassen.

    Bei Fragen und Anregungen könnt Ihr gerne hier, oder besser auf GitHub schreiben.

    /**** 
     * 
     * API Version: August 2022
     * Limitations: 300 Requests per Day / 3 concurrent API Calls
     * 
    ****/
    
    const pfad      = "0_userdata.0.Systemdaten.Solaranlage.";
    const debug     = false;
    const fetch     = require('request');
    
    /******* ENDE DER KONFIGURATION *******/
    
    // Datenpunkte anlegen
    if( checkStates( pfad +'Konfiguration.APIKey' ) === false ) return true;
    
    // Aktuelle Leistung ermitteln
    schedule('*/5 4-22 * * *', function(){
    
        var Zeit        = getTime();
        const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
        const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
    
        let plants = getActivePlants();
        plants.forEach( function(plant){
            
            if( debug ) log('Die aktuelle Lesitung der Anlage "'+ plant +'" wird verarbeitet.');
            var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/power?startTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2000:00:00&endTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2023:59:00&api_key="+ apikey;
    
            
            fetch( url , function ( err, state, body ){
        
                if (err) log( "Fehler aufgetreten: " + err, "error" );
                else{
                    
                    var data = JSON.parse( body );
                    data = data.power.values.filter(function(jsonObject) {
                        return jsonObject.value != null;
                    });
    
                    var l = data.length -1;
                    data = ( data[l].value / 1000 ).toFixed(2);
    
                    if( debug ) log( 'Die Anlage erzeugt derzeit '+ Number( data ) +' kW.' );
                    setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jetzt', Number( data ), true );
    
                    //Ermittle maximale Leistung Heute
                    if( data > getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val ) {
                        if( debug ) log( 'Die maximale Leistung heute beträgt '+ Number( data ) +' kW.' );
                        setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', Number( data ), true );
                    }
                    
                }
            });
    
        });
    
    });
    
    //Energieertrag ermitteln
    schedule('*/15 4-22 * * *', function(){
    
        var Zeit        = getTime();
        const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
        const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
    
        let plants = getActivePlants();
        plants.forEach( function(plant){
            
            if( debug ) log('Der Energieertrag der Anlage "'+ plant +'" wird verarbeitet.');
    
            let url = new Object();
            
            url['heute']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=DAY&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&api_key="+ apikey;
            url['monat']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=MONTH&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.ltm +"&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-01&api_key="+ apikey;
            url['jahr']     = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=YEAR&endDate="+ Zeit.jahr +"-12-31&startDate="+ Zeit.jahr +"-01-01&api_key="+ apikey;
    
            // Heutige Erzeugung
            fetch( url.heute , function ( err, state, body ){
                if (err) log( "Fehler aufgetreten: " + err );
                else{
                    var data = JSON.parse( body );
                    data = ( data.energy.values[0].value / 1000 ).toFixed(2);
    
                    if(debug) log( 'Die Anlage hat heute '+ data +' kWh erzeugt.' );
                    setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Heute', Number( data ), true );
                }
            });
            
            // Monatliche Erzeugung
            fetch( url.monat , function ( err, state, body ){
                if (err) log( "Fehler aufgetreten: " + err );
                else{
                    var data = JSON.parse( body );
                    data = ( data.energy.values[0].value / 1000 ).toFixed(2);
    
                    if(debug) log( 'Die Anlage hat diesen Monat '+ data +' kWh erzeugt.' );
                    setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Monat', Number( data ), true );
                }
            });
            
            // Jährliche Erzeugung
            fetch( url.jahr , function ( err, state, body ){
                if (err) log( "Fehler aufgetreten: " + err );
                else{
                    var data = JSON.parse( body );
                    data = ( data.energy.values[0].value / 1000 ).toFixed(2);
    
                    if(debug) log( 'Die Anlage hat dieses Jahr '+ data +' kWh erzeugt.' );
                    setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jahr', Number( data ), true );
                }
            });        
    
        });
    
    });
    
    // Umweltbilanz ermitteln
    schedule('0 */2 4-22 * *', function(){
    
        var Zeit        = getTime();
        const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
        const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
    
        let plants = getActivePlants();
        plants.forEach( function(plant){
            
            if( debug ) log('Die Umweltbilanz der Anlage "'+ plant +'" wird verarbeitet.');
            var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/envBenefits?systemUnits="+ unit.api +"&api_key="+ apikey
            
            fetch( url , function ( err, state, body ){
                if (err) log( "Fehler aufgetreten: " + err );
                else{
                    var data = JSON.parse( body );
                    var co2     = data.envBenefits.gasEmissionSaved.co2.toFixed(2);
                    var trees   = data.envBenefits.treesPlanted.toFixed(2);
    
                    if(debug) log( 'Die Anlage hat bislang '+ co2 +' '+ unit.unit +' eingespart.' );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt', Number( co2 ), true );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Heute', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag' ).val ), true );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat' ).val ), true );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr' ).val ), true );
    
                    if(debug) log( 'Das enspricht einer Anzahl von '+ trees +' Bäumen.' );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt', Number( trees ), true );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Heute', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag' ).val ), true );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat' ).val ), true );
                    setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr' ).val ), true );
                }
            });
    
        })
    
    });
    
    //Systemdaten ermitteln
    function systemdaten(){
    
        const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
        const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
    
        if( apikey !== 0 ){
    
            const url = "https://monitoringapi.solaredge.com/sites/list?size=5&searchText=Lyon&sortProperty=name&sortOrder=ASC&api_key="+ apikey;
    
            fetch( url , function ( err, state, body ){
                
                if (err) log( "Fehler aufgetreten: " + err );
                else{
                    var data = JSON.parse( body );
    
                    data.sites.site.forEach( function(anlage){
    
                        if( existsState( pfad +'Anlagen.'+ anlage['id'] +'.Name' ) === false ) log( 'Die Anlage "'+ anlage['name'] +'" ( ID: '+ anlage['id'] +' ) wird erstellt.' );
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Name', anlage['name'], {read: true, write: false, type: 'string', desc: 'Bezeichnung der Anlage'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.AccountID', anlage['accountId'], {read: true, write: false, type: 'string', desc: 'Konto ID'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Status', anlage['status'], {read: true, write: false, type: 'string', desc: 'Kontostatus'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.kWp', anlage['peakPower'], {read: true, write: false, unit: 'kWp', type: 'string', desc: 'Installierte Leistung'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Update', anlage['lastUpdateTime'], {read: true, write: false, type: 'string', desc: 'Letzte aktualisierung der Daten'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Waehrung', anlage['currency'], {read: true, write: false, type: 'string', desc: 'Angegebene Währung'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Installationsdatum', anlage['installationDate'], {read: true, write: false, type: 'string', desc: 'Installationsdatum der Anlage'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Bemerkungen', anlage['notes'], {read: true, write: false, type: 'string', desc: 'Bemerkungen zur Anlage'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Typ', anlage['type'], {read: true, write: false, type: 'string', desc: 'Anlagentyp'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Oeffentlich', anlage['publicSettings'].isPublic, {read: true, write: false, type: 'boolean', desc: 'Anlage öffentlich einsehbar'} );
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Land', anlage['location'].country, {read: true, write: false, type: 'string', desc: 'Land in dem sich die Anlage befindet'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Stadt', anlage['location'].city, {read: true, write: false, type: 'string', desc: 'Stadt in der sich die Anlage befindet'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse', anlage['location'].address, {read: true, write: false, type: 'string', desc: 'Adresse an der sich die Anlage befindet'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse2', anlage['location'].address2, {read: true, write: false, type: 'string', desc: 'Adresse 2 an der sich die Anlage befindet'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Postleitzahl', anlage['location'].zip, {read: true, write: false, type: 'string', desc: 'Postleitzahl an der sich die Anlage befindet'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Zeitzone', anlage['location'].timeZone, {read: true, write: false, type: 'string', desc: 'Zeitzone in der sich die Anlage befindet'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Laendercode', anlage['location'].countryCode, {read: true, write: false, type: 'string', desc: 'Ländercode an der sich die Anlage befindet'} );
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Hersteller', anlage['primaryModule'].manufacturerName, {read: true, write: false, type: 'string', desc: 'Hersteller der Solarmodule'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Modelbezeichnung', anlage['primaryModule'].modelName, {read: true, write: false, type: 'string', desc: 'Modelbezeichnung der Solarmodule'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Leistung', anlage['primaryModule'].maximumPower, {read: true, write: false, unit: 'W', type: 'number', desc: 'Maximale Leistung eines Moduls'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Temperaturkoeffizient', anlage['primaryModule'].temperatureCoef, {read: true, write: false, unit: '%', type: 'number', desc: 'Temperaturkoeffizient eines Moduls'} );
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Bild', anlage['uris'].SITE_IMAGE, {read: true, write: false, type: 'string', desc: 'Bild der Anlage'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Details', anlage['uris'].DETAILS, {read: true, write: false, type: 'string', desc: 'Link zu den Details'} );
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Uebersicht', anlage['uris'].OVERVIEW, {read: true, write: false, type: 'string', desc: 'Link zur Übersicht'} );
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jetzt', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Aktuelle Leistung'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Heute', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Heute erzeugte Energie'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Monat', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Diesen Monat erzeugte Energie'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jahr', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Dieses Jahr erzeugte Energie'});
                            
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Heute', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Heute'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Gestern', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Gestern'});
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Gesamt', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Heute', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Monat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Jahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Gesamt', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Heute', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Monat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Jahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vortag', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume Gestern'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vortag', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 Gestern'});
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vormonat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume vorigen Monats'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vormonat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 vorigen Monats'});
    
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vorjahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume voriges Jahr'});
                        createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vorjahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 voriges Jahr'});
    
                    });
    
                }
    
            });
    
            // Reset Anlagen einlesen
            if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) setState( pfad +'Konfiguration.AnlagenEinlesen', false, true );
    
        } else log( 'Es wurde kein API Schlüssel angegeben.', "error" );
    
    }
    
    //Datum und Uhrzeit
    function getTime(){
        
        let data = new Object();
        var d = new Date();
    
        data['stunde']  = ( '0'+ d.getHours() ).substr(-2);
        data['minute']  = ( '0'+ d.getMinutes() ).substr(-2);
        data['sekunde'] = ( '0'+ d.getSeconds() ).substr(-2);;
        data['tag']     = d.getDate();
        data['monat']   = ( '0'+ ( d.getMonth() +1 ) ).substr(-2);
        data['jahr']    = d.getFullYear();
        data['ltm']     = (new Date( d.getFullYear(), d.getMonth()+1, 0 )).getDate();
    
        return data;
    
    }
    
    //Einheiten auslesen
    function getUnits( u ){
    
        var unit = new Object();
        if( u == 0 ){
    
            unit['api'] = "Metrics",
            unit['unit'] = "Kg"
    
        } else if ( u == 1 ){
    
            unit['api'] = "Imperial",
            unit['unit'] = "Lb"
    
        };
    
        return unit;
    
    }
    
    function getActivePlants(){
    
        let anlagen = new Array;
        let cache = $('channel[state.id='+ pfad +'Anlagen.*.Status]');
    
        cache.each(function(obj){
            if( existsState( obj ) && getState( obj ).val == 'Active' ){
                var id = obj.split(".");
                anlagen.push( id[ (id.length-2) ] );
            }
        });
    
        return anlagen;
    
    };
    
    // Tägliche Jobs
    schedule('0 0 * * *', function () {
    
        let plants = getActivePlants();
        plants.forEach( function(plant){
    
            if(debug) log( 'Setze tägliche Berechnungsdaten für die Anlage '+ plant );
    
            setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Gestern', getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val, true );  
            setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
            setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
    
            //Zähler zurücksetzen
            setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', 0, true );
    
            //Anlagendaten einlesen
            systemdaten();
        
        });
    
    });
    
    // Monatliche Jobs
    schedule('0 0 1 * *', function () {
    
        let plants = getActivePlants();
        plants.forEach( function(plant){
    
            if(debug) log( 'Setze monatliche Berechnungsdaten für die Anlage '+ plant );
    
            setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
            setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
    
            //Zähler zurücksetzen
            setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', 0, true );
            setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', 0, true );
        
        });
    
    });
    
    // Jährliche Jobs
    schedule('0 0 1 1 *', function () {
    
        let plants = getActivePlants();
        plants.forEach( function(plant){
    
            if(debug) log( 'Setze jährliche Berechnungsdaten für die Anlage '+ plant );
    
            setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
            setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
    
            //Zähler zurücksetzen
            setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', 0, true );
            setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', 0, true );
        
        });
    
    });
    
    //Datenpunkte prüfen
    function checkStates( state ){
    
        if( existsState( state ) === false ){
    
            log('Initialeinreichtung wird durchgeführt. Bitte den API Key in der Konfiguration eingeben.', 'warn');
            createStates( pfad );
            return false;
    
        } else return true;
    
    };
    
    // Anlagen einlesen wenn erzwungen
    schedule('* * * * *', function(){
        if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) systemdaten();
    });
    
    //Datenpunkte erstellen
    function createStates( pfad ){
    
        let einheiten = ['Metrisch', 'Imperial'];
    
        createState( pfad +'Konfiguration.APIKey', 0, {read: true, write: true, type: 'string', desc: 'Solaredge API Schlüssel'});
        createState( pfad +'Konfiguration.AnlagenEinlesen', true, {read: true, write: true, type: 'boolean', desc: 'Anlagen neu einlesen'});
        createState( pfad +'Konfiguration.Einheit', 0, {read: true, write: true, type: 'number', desc: 'Metrische oder Imperiale Einheiten', states: einheiten});
        
    }
    
    S arteckA 2 Antworten Letzte Antwort
    0
    • T TobStar

      Hallo zusammen,

      nun läuft auch endlich unsere PV Anlage. Wir haben einen Solaredge Wechselrichter erhalten und der fertige Adapter scheint nicht mehr gepflegt zu werden, bzw. liest er mir auch zu wenige Daten aus. Daher habe ich mich an die API gemacht und ein Script dazu erstellt.

      Dieses findet Ihr in der aktuellsten Version auf GitHub unter https://github.com/GodHunter/iobroker-solaredge dort sind auch alle Informationen zur Einrichtung beschrieben.

      Da wir leider keinen Speicher im Einsatz haben, kann ich auf andere, relevante Daten leider nicht zurückgreifen. Falls jemand also einen Wechselrichter mit Speicher im Einsatz hat, würde ich mich über einen API Key freuen um diese Daten ebenfalls ins Script einfließen zu lassen.

      Bei Fragen und Anregungen könnt Ihr gerne hier, oder besser auf GitHub schreiben.

      /**** 
       * 
       * API Version: August 2022
       * Limitations: 300 Requests per Day / 3 concurrent API Calls
       * 
      ****/
      
      const pfad      = "0_userdata.0.Systemdaten.Solaranlage.";
      const debug     = false;
      const fetch     = require('request');
      
      /******* ENDE DER KONFIGURATION *******/
      
      // Datenpunkte anlegen
      if( checkStates( pfad +'Konfiguration.APIKey' ) === false ) return true;
      
      // Aktuelle Leistung ermitteln
      schedule('*/5 4-22 * * *', function(){
      
          var Zeit        = getTime();
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
              
              if( debug ) log('Die aktuelle Lesitung der Anlage "'+ plant +'" wird verarbeitet.');
              var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/power?startTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2000:00:00&endTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2023:59:00&api_key="+ apikey;
      
              
              fetch( url , function ( err, state, body ){
          
                  if (err) log( "Fehler aufgetreten: " + err, "error" );
                  else{
                      
                      var data = JSON.parse( body );
                      data = data.power.values.filter(function(jsonObject) {
                          return jsonObject.value != null;
                      });
      
                      var l = data.length -1;
                      data = ( data[l].value / 1000 ).toFixed(2);
      
                      if( debug ) log( 'Die Anlage erzeugt derzeit '+ Number( data ) +' kW.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jetzt', Number( data ), true );
      
                      //Ermittle maximale Leistung Heute
                      if( data > getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val ) {
                          if( debug ) log( 'Die maximale Leistung heute beträgt '+ Number( data ) +' kW.' );
                          setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', Number( data ), true );
                      }
                      
                  }
              });
      
          });
      
      });
      
      //Energieertrag ermitteln
      schedule('*/15 4-22 * * *', function(){
      
          var Zeit        = getTime();
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
              
              if( debug ) log('Der Energieertrag der Anlage "'+ plant +'" wird verarbeitet.');
      
              let url = new Object();
              
              url['heute']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=DAY&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&api_key="+ apikey;
              url['monat']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=MONTH&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.ltm +"&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-01&api_key="+ apikey;
              url['jahr']     = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=YEAR&endDate="+ Zeit.jahr +"-12-31&startDate="+ Zeit.jahr +"-01-01&api_key="+ apikey;
      
              // Heutige Erzeugung
              fetch( url.heute , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      data = ( data.energy.values[0].value / 1000 ).toFixed(2);
      
                      if(debug) log( 'Die Anlage hat heute '+ data +' kWh erzeugt.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Heute', Number( data ), true );
                  }
              });
              
              // Monatliche Erzeugung
              fetch( url.monat , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      data = ( data.energy.values[0].value / 1000 ).toFixed(2);
      
                      if(debug) log( 'Die Anlage hat diesen Monat '+ data +' kWh erzeugt.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Monat', Number( data ), true );
                  }
              });
              
              // Jährliche Erzeugung
              fetch( url.jahr , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      data = ( data.energy.values[0].value / 1000 ).toFixed(2);
      
                      if(debug) log( 'Die Anlage hat dieses Jahr '+ data +' kWh erzeugt.' );
                      setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jahr', Number( data ), true );
                  }
              });        
      
          });
      
      });
      
      // Umweltbilanz ermitteln
      schedule('0 */2 4-22 * *', function(){
      
          var Zeit        = getTime();
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
              
              if( debug ) log('Die Umweltbilanz der Anlage "'+ plant +'" wird verarbeitet.');
              var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/envBenefits?systemUnits="+ unit.api +"&api_key="+ apikey
              
              fetch( url , function ( err, state, body ){
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
                      var co2     = data.envBenefits.gasEmissionSaved.co2.toFixed(2);
                      var trees   = data.envBenefits.treesPlanted.toFixed(2);
      
                      if(debug) log( 'Die Anlage hat bislang '+ co2 +' '+ unit.unit +' eingespart.' );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt', Number( co2 ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Heute', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr' ).val ), true );
      
                      if(debug) log( 'Das enspricht einer Anzahl von '+ trees +' Bäumen.' );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt', Number( trees ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Heute', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat' ).val ), true );
                      setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr' ).val ), true );
                  }
              });
      
          })
      
      });
      
      //Systemdaten ermitteln
      function systemdaten(){
      
          const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
          const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
      
          if( apikey !== 0 ){
      
              const url = "https://monitoringapi.solaredge.com/sites/list?size=5&searchText=Lyon&sortProperty=name&sortOrder=ASC&api_key="+ apikey;
      
              fetch( url , function ( err, state, body ){
                  
                  if (err) log( "Fehler aufgetreten: " + err );
                  else{
                      var data = JSON.parse( body );
      
                      data.sites.site.forEach( function(anlage){
      
                          if( existsState( pfad +'Anlagen.'+ anlage['id'] +'.Name' ) === false ) log( 'Die Anlage "'+ anlage['name'] +'" ( ID: '+ anlage['id'] +' ) wird erstellt.' );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Name', anlage['name'], {read: true, write: false, type: 'string', desc: 'Bezeichnung der Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.AccountID', anlage['accountId'], {read: true, write: false, type: 'string', desc: 'Konto ID'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Status', anlage['status'], {read: true, write: false, type: 'string', desc: 'Kontostatus'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.kWp', anlage['peakPower'], {read: true, write: false, unit: 'kWp', type: 'string', desc: 'Installierte Leistung'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Update', anlage['lastUpdateTime'], {read: true, write: false, type: 'string', desc: 'Letzte aktualisierung der Daten'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Waehrung', anlage['currency'], {read: true, write: false, type: 'string', desc: 'Angegebene Währung'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Installationsdatum', anlage['installationDate'], {read: true, write: false, type: 'string', desc: 'Installationsdatum der Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Bemerkungen', anlage['notes'], {read: true, write: false, type: 'string', desc: 'Bemerkungen zur Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Typ', anlage['type'], {read: true, write: false, type: 'string', desc: 'Anlagentyp'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Oeffentlich', anlage['publicSettings'].isPublic, {read: true, write: false, type: 'boolean', desc: 'Anlage öffentlich einsehbar'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Land', anlage['location'].country, {read: true, write: false, type: 'string', desc: 'Land in dem sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Stadt', anlage['location'].city, {read: true, write: false, type: 'string', desc: 'Stadt in der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse', anlage['location'].address, {read: true, write: false, type: 'string', desc: 'Adresse an der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse2', anlage['location'].address2, {read: true, write: false, type: 'string', desc: 'Adresse 2 an der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Postleitzahl', anlage['location'].zip, {read: true, write: false, type: 'string', desc: 'Postleitzahl an der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Zeitzone', anlage['location'].timeZone, {read: true, write: false, type: 'string', desc: 'Zeitzone in der sich die Anlage befindet'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Laendercode', anlage['location'].countryCode, {read: true, write: false, type: 'string', desc: 'Ländercode an der sich die Anlage befindet'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Hersteller', anlage['primaryModule'].manufacturerName, {read: true, write: false, type: 'string', desc: 'Hersteller der Solarmodule'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Modelbezeichnung', anlage['primaryModule'].modelName, {read: true, write: false, type: 'string', desc: 'Modelbezeichnung der Solarmodule'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Leistung', anlage['primaryModule'].maximumPower, {read: true, write: false, unit: 'W', type: 'number', desc: 'Maximale Leistung eines Moduls'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Temperaturkoeffizient', anlage['primaryModule'].temperatureCoef, {read: true, write: false, unit: '%', type: 'number', desc: 'Temperaturkoeffizient eines Moduls'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Bild', anlage['uris'].SITE_IMAGE, {read: true, write: false, type: 'string', desc: 'Bild der Anlage'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Details', anlage['uris'].DETAILS, {read: true, write: false, type: 'string', desc: 'Link zu den Details'} );
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Uebersicht', anlage['uris'].OVERVIEW, {read: true, write: false, type: 'string', desc: 'Link zur Übersicht'} );
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jetzt', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Aktuelle Leistung'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Heute', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Heute erzeugte Energie'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Monat', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Diesen Monat erzeugte Energie'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jahr', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Dieses Jahr erzeugte Energie'});
                              
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Heute', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Heute'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Gestern', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Gestern'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Gesamt', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Heute', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Monat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Jahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Gesamt', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Heute', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Monat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Jahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vortag', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume Gestern'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vortag', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 Gestern'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vormonat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume vorigen Monats'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vormonat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 vorigen Monats'});
      
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vorjahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume voriges Jahr'});
                          createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vorjahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 voriges Jahr'});
      
                      });
      
                  }
      
              });
      
              // Reset Anlagen einlesen
              if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) setState( pfad +'Konfiguration.AnlagenEinlesen', false, true );
      
          } else log( 'Es wurde kein API Schlüssel angegeben.', "error" );
      
      }
      
      //Datum und Uhrzeit
      function getTime(){
          
          let data = new Object();
          var d = new Date();
      
          data['stunde']  = ( '0'+ d.getHours() ).substr(-2);
          data['minute']  = ( '0'+ d.getMinutes() ).substr(-2);
          data['sekunde'] = ( '0'+ d.getSeconds() ).substr(-2);;
          data['tag']     = d.getDate();
          data['monat']   = ( '0'+ ( d.getMonth() +1 ) ).substr(-2);
          data['jahr']    = d.getFullYear();
          data['ltm']     = (new Date( d.getFullYear(), d.getMonth()+1, 0 )).getDate();
      
          return data;
      
      }
      
      //Einheiten auslesen
      function getUnits( u ){
      
          var unit = new Object();
          if( u == 0 ){
      
              unit['api'] = "Metrics",
              unit['unit'] = "Kg"
      
          } else if ( u == 1 ){
      
              unit['api'] = "Imperial",
              unit['unit'] = "Lb"
      
          };
      
          return unit;
      
      }
      
      function getActivePlants(){
      
          let anlagen = new Array;
          let cache = $('channel[state.id='+ pfad +'Anlagen.*.Status]');
      
          cache.each(function(obj){
              if( existsState( obj ) && getState( obj ).val == 'Active' ){
                  var id = obj.split(".");
                  anlagen.push( id[ (id.length-2) ] );
              }
          });
      
          return anlagen;
      
      };
      
      // Tägliche Jobs
      schedule('0 0 * * *', function () {
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
      
              if(debug) log( 'Setze tägliche Berechnungsdaten für die Anlage '+ plant );
      
              setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Gestern', getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val, true );  
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
      
              //Zähler zurücksetzen
              setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', 0, true );
      
              //Anlagendaten einlesen
              systemdaten();
          
          });
      
      });
      
      // Monatliche Jobs
      schedule('0 0 1 * *', function () {
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
      
              if(debug) log( 'Setze monatliche Berechnungsdaten für die Anlage '+ plant );
      
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
      
              //Zähler zurücksetzen
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', 0, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', 0, true );
          
          });
      
      });
      
      // Jährliche Jobs
      schedule('0 0 1 1 *', function () {
      
          let plants = getActivePlants();
          plants.forEach( function(plant){
      
              if(debug) log( 'Setze jährliche Berechnungsdaten für die Anlage '+ plant );
      
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
      
              //Zähler zurücksetzen
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', 0, true );
              setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', 0, true );
          
          });
      
      });
      
      //Datenpunkte prüfen
      function checkStates( state ){
      
          if( existsState( state ) === false ){
      
              log('Initialeinreichtung wird durchgeführt. Bitte den API Key in der Konfiguration eingeben.', 'warn');
              createStates( pfad );
              return false;
      
          } else return true;
      
      };
      
      // Anlagen einlesen wenn erzwungen
      schedule('* * * * *', function(){
          if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) systemdaten();
      });
      
      //Datenpunkte erstellen
      function createStates( pfad ){
      
          let einheiten = ['Metrisch', 'Imperial'];
      
          createState( pfad +'Konfiguration.APIKey', 0, {read: true, write: true, type: 'string', desc: 'Solaredge API Schlüssel'});
          createState( pfad +'Konfiguration.AnlagenEinlesen', true, {read: true, write: true, type: 'boolean', desc: 'Anlagen neu einlesen'});
          createState( pfad +'Konfiguration.Einheit', 0, {read: true, write: true, type: 'number', desc: 'Metrische oder Imperiale Einheiten', states: einheiten});
          
      }
      
      S Offline
      S Offline
      smarteppi
      schrieb am zuletzt editiert von
      #2

      @tobstar Lässt sich leider nicht installieren

      $ iobroker url https://github.com/GodHunter/iobroker-solaredge --host iobroker --debug

      install GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3

      NPM version: 8.18.0

      Installing GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3... (System call)

      npm WARN tarball tarball data for github:GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3 (null) seems to be corrupted. Trying again.

      npm WARN tarball tarball data for github:GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3 (null) seems to be corrupted. Trying again.

      npm ERR! syscall opennpm ERR! path /home/iobroker/.npm/_cacache/tmp/git-cloneBETFYT/package.jsonnpm ERR! errno -2

      npm ERR! enoent ENOENT: no such file or directory, open '/home/iobroker/.npm/_cacache/tmp/git-cloneBETFYT/package.json'npm ERR! enoent This is related to npm not being able to find a file.npm ERR! enoent

      npm ERR! A complete log of this run can be found in:npm ERR! /home/iobroker/.npm/_logs/2023-02-20T20_38_17_488Z-debug-0.log

      host.iobroker Cannot install GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3: 254

      ERROR: Process exited with code 25

      wendy2702W 1 Antwort Letzte Antwort
      0
      • S smarteppi

        @tobstar Lässt sich leider nicht installieren

        $ iobroker url https://github.com/GodHunter/iobroker-solaredge --host iobroker --debug

        install GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3

        NPM version: 8.18.0

        Installing GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3... (System call)

        npm WARN tarball tarball data for github:GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3 (null) seems to be corrupted. Trying again.

        npm WARN tarball tarball data for github:GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3 (null) seems to be corrupted. Trying again.

        npm ERR! syscall opennpm ERR! path /home/iobroker/.npm/_cacache/tmp/git-cloneBETFYT/package.jsonnpm ERR! errno -2

        npm ERR! enoent ENOENT: no such file or directory, open '/home/iobroker/.npm/_cacache/tmp/git-cloneBETFYT/package.json'npm ERR! enoent This is related to npm not being able to find a file.npm ERR! enoent

        npm ERR! A complete log of this run can be found in:npm ERR! /home/iobroker/.npm/_logs/2023-02-20T20_38_17_488Z-debug-0.log

        host.iobroker Cannot install GodHunter/iobroker-solaredge#94e4125654452f5f7024ff36fd8e03a8301279a3: 254

        ERROR: Process exited with code 25

        wendy2702W Offline
        wendy2702W Offline
        wendy2702
        schrieb am zuletzt editiert von
        #3

        @smarteppi Das ist ein Script und kein Adapter.

        Das muss man als Script in die JavaScript Instanz eingefügt werden.

        Bitte keine Fragen per PN, die gehören ins Forum!

        Benutzt das Voting rechts unten im Beitrag wenn er euch geholfen hat.

        S 1 Antwort Letzte Antwort
        1
        • T TobStar

          Hallo zusammen,

          nun läuft auch endlich unsere PV Anlage. Wir haben einen Solaredge Wechselrichter erhalten und der fertige Adapter scheint nicht mehr gepflegt zu werden, bzw. liest er mir auch zu wenige Daten aus. Daher habe ich mich an die API gemacht und ein Script dazu erstellt.

          Dieses findet Ihr in der aktuellsten Version auf GitHub unter https://github.com/GodHunter/iobroker-solaredge dort sind auch alle Informationen zur Einrichtung beschrieben.

          Da wir leider keinen Speicher im Einsatz haben, kann ich auf andere, relevante Daten leider nicht zurückgreifen. Falls jemand also einen Wechselrichter mit Speicher im Einsatz hat, würde ich mich über einen API Key freuen um diese Daten ebenfalls ins Script einfließen zu lassen.

          Bei Fragen und Anregungen könnt Ihr gerne hier, oder besser auf GitHub schreiben.

          /**** 
           * 
           * API Version: August 2022
           * Limitations: 300 Requests per Day / 3 concurrent API Calls
           * 
          ****/
          
          const pfad      = "0_userdata.0.Systemdaten.Solaranlage.";
          const debug     = false;
          const fetch     = require('request');
          
          /******* ENDE DER KONFIGURATION *******/
          
          // Datenpunkte anlegen
          if( checkStates( pfad +'Konfiguration.APIKey' ) === false ) return true;
          
          // Aktuelle Leistung ermitteln
          schedule('*/5 4-22 * * *', function(){
          
              var Zeit        = getTime();
              const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
              const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
          
              let plants = getActivePlants();
              plants.forEach( function(plant){
                  
                  if( debug ) log('Die aktuelle Lesitung der Anlage "'+ plant +'" wird verarbeitet.');
                  var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/power?startTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2000:00:00&endTime="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"%2023:59:00&api_key="+ apikey;
          
                  
                  fetch( url , function ( err, state, body ){
              
                      if (err) log( "Fehler aufgetreten: " + err, "error" );
                      else{
                          
                          var data = JSON.parse( body );
                          data = data.power.values.filter(function(jsonObject) {
                              return jsonObject.value != null;
                          });
          
                          var l = data.length -1;
                          data = ( data[l].value / 1000 ).toFixed(2);
          
                          if( debug ) log( 'Die Anlage erzeugt derzeit '+ Number( data ) +' kW.' );
                          setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jetzt', Number( data ), true );
          
                          //Ermittle maximale Leistung Heute
                          if( data > getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val ) {
                              if( debug ) log( 'Die maximale Leistung heute beträgt '+ Number( data ) +' kW.' );
                              setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', Number( data ), true );
                          }
                          
                      }
                  });
          
              });
          
          });
          
          //Energieertrag ermitteln
          schedule('*/15 4-22 * * *', function(){
          
              var Zeit        = getTime();
              const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
              const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
          
              let plants = getActivePlants();
              plants.forEach( function(plant){
                  
                  if( debug ) log('Der Energieertrag der Anlage "'+ plant +'" wird verarbeitet.');
          
                  let url = new Object();
                  
                  url['heute']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=DAY&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.tag +"&api_key="+ apikey;
                  url['monat']    = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=MONTH&endDate="+ Zeit.jahr +"-"+ Zeit.monat +"-"+ Zeit.ltm +"&startDate="+ Zeit.jahr +"-"+ Zeit.monat +"-01&api_key="+ apikey;
                  url['jahr']     = "https://monitoringapi.solaredge.com/site/"+ plant +"/energy?timeUnit=YEAR&endDate="+ Zeit.jahr +"-12-31&startDate="+ Zeit.jahr +"-01-01&api_key="+ apikey;
          
                  // Heutige Erzeugung
                  fetch( url.heute , function ( err, state, body ){
                      if (err) log( "Fehler aufgetreten: " + err );
                      else{
                          var data = JSON.parse( body );
                          data = ( data.energy.values[0].value / 1000 ).toFixed(2);
          
                          if(debug) log( 'Die Anlage hat heute '+ data +' kWh erzeugt.' );
                          setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Heute', Number( data ), true );
                      }
                  });
                  
                  // Monatliche Erzeugung
                  fetch( url.monat , function ( err, state, body ){
                      if (err) log( "Fehler aufgetreten: " + err );
                      else{
                          var data = JSON.parse( body );
                          data = ( data.energy.values[0].value / 1000 ).toFixed(2);
          
                          if(debug) log( 'Die Anlage hat diesen Monat '+ data +' kWh erzeugt.' );
                          setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Monat', Number( data ), true );
                      }
                  });
                  
                  // Jährliche Erzeugung
                  fetch( url.jahr , function ( err, state, body ){
                      if (err) log( "Fehler aufgetreten: " + err );
                      else{
                          var data = JSON.parse( body );
                          data = ( data.energy.values[0].value / 1000 ).toFixed(2);
          
                          if(debug) log( 'Die Anlage hat dieses Jahr '+ data +' kWh erzeugt.' );
                          setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Jahr', Number( data ), true );
                      }
                  });        
          
              });
          
          });
          
          // Umweltbilanz ermitteln
          schedule('0 */2 4-22 * *', function(){
          
              var Zeit        = getTime();
              const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
              const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
          
              let plants = getActivePlants();
              plants.forEach( function(plant){
                  
                  if( debug ) log('Die Umweltbilanz der Anlage "'+ plant +'" wird verarbeitet.');
                  var url = "https://monitoringapi.solaredge.com/site/"+ plant +"/envBenefits?systemUnits="+ unit.api +"&api_key="+ apikey
                  
                  fetch( url , function ( err, state, body ){
                      if (err) log( "Fehler aufgetreten: " + err );
                      else{
                          var data = JSON.parse( body );
                          var co2     = data.envBenefits.gasEmissionSaved.co2.toFixed(2);
                          var trees   = data.envBenefits.treesPlanted.toFixed(2);
          
                          if(debug) log( 'Die Anlage hat bislang '+ co2 +' '+ unit.unit +' eingespart.' );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt', Number( co2 ), true );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Heute', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag' ).val ), true );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat' ).val ), true );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', Number( co2 - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr' ).val ), true );
          
                          if(debug) log( 'Das enspricht einer Anzahl von '+ trees +' Bäumen.' );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt', Number( trees ), true );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Heute', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag' ).val ), true );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat' ).val ), true );
                          setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', Number( trees - getState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr' ).val ), true );
                      }
                  });
          
              })
          
          });
          
          //Systemdaten ermitteln
          function systemdaten(){
          
              const apikey    = getState( pfad +'Konfiguration.APIKey' ).val;
              const unit      = getUnits( getState( pfad +'Konfiguration.Einheit' ).val );
          
              if( apikey !== 0 ){
          
                  const url = "https://monitoringapi.solaredge.com/sites/list?size=5&searchText=Lyon&sortProperty=name&sortOrder=ASC&api_key="+ apikey;
          
                  fetch( url , function ( err, state, body ){
                      
                      if (err) log( "Fehler aufgetreten: " + err );
                      else{
                          var data = JSON.parse( body );
          
                          data.sites.site.forEach( function(anlage){
          
                              if( existsState( pfad +'Anlagen.'+ anlage['id'] +'.Name' ) === false ) log( 'Die Anlage "'+ anlage['name'] +'" ( ID: '+ anlage['id'] +' ) wird erstellt.' );
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Name', anlage['name'], {read: true, write: false, type: 'string', desc: 'Bezeichnung der Anlage'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.AccountID', anlage['accountId'], {read: true, write: false, type: 'string', desc: 'Konto ID'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Status', anlage['status'], {read: true, write: false, type: 'string', desc: 'Kontostatus'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.kWp', anlage['peakPower'], {read: true, write: false, unit: 'kWp', type: 'string', desc: 'Installierte Leistung'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Update', anlage['lastUpdateTime'], {read: true, write: false, type: 'string', desc: 'Letzte aktualisierung der Daten'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Waehrung', anlage['currency'], {read: true, write: false, type: 'string', desc: 'Angegebene Währung'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Installationsdatum', anlage['installationDate'], {read: true, write: false, type: 'string', desc: 'Installationsdatum der Anlage'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Bemerkungen', anlage['notes'], {read: true, write: false, type: 'string', desc: 'Bemerkungen zur Anlage'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Typ', anlage['type'], {read: true, write: false, type: 'string', desc: 'Anlagentyp'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Oeffentlich', anlage['publicSettings'].isPublic, {read: true, write: false, type: 'boolean', desc: 'Anlage öffentlich einsehbar'} );
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Land', anlage['location'].country, {read: true, write: false, type: 'string', desc: 'Land in dem sich die Anlage befindet'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Stadt', anlage['location'].city, {read: true, write: false, type: 'string', desc: 'Stadt in der sich die Anlage befindet'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse', anlage['location'].address, {read: true, write: false, type: 'string', desc: 'Adresse an der sich die Anlage befindet'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Adresse2', anlage['location'].address2, {read: true, write: false, type: 'string', desc: 'Adresse 2 an der sich die Anlage befindet'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Postleitzahl', anlage['location'].zip, {read: true, write: false, type: 'string', desc: 'Postleitzahl an der sich die Anlage befindet'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Zeitzone', anlage['location'].timeZone, {read: true, write: false, type: 'string', desc: 'Zeitzone in der sich die Anlage befindet'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Standort.Laendercode', anlage['location'].countryCode, {read: true, write: false, type: 'string', desc: 'Ländercode an der sich die Anlage befindet'} );
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Hersteller', anlage['primaryModule'].manufacturerName, {read: true, write: false, type: 'string', desc: 'Hersteller der Solarmodule'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Modelbezeichnung', anlage['primaryModule'].modelName, {read: true, write: false, type: 'string', desc: 'Modelbezeichnung der Solarmodule'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Leistung', anlage['primaryModule'].maximumPower, {read: true, write: false, unit: 'W', type: 'number', desc: 'Maximale Leistung eines Moduls'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Module.Temperaturkoeffizient', anlage['primaryModule'].temperatureCoef, {read: true, write: false, unit: '%', type: 'number', desc: 'Temperaturkoeffizient eines Moduls'} );
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Bild', anlage['uris'].SITE_IMAGE, {read: true, write: false, type: 'string', desc: 'Bild der Anlage'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Details', anlage['uris'].DETAILS, {read: true, write: false, type: 'string', desc: 'Link zu den Details'} );
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Links.Uebersicht', anlage['uris'].OVERVIEW, {read: true, write: false, type: 'string', desc: 'Link zur Übersicht'} );
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jetzt', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Aktuelle Leistung'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Heute', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Heute erzeugte Energie'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Monat', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Diesen Monat erzeugte Energie'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Jahr', 0, {read: true, write: false, type: 'number', unit: 'kWh', desc: 'Dieses Jahr erzeugte Energie'});
                                  
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Heute', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Heute'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Erzeugung.Max_Gestern', 0, {read: true, write: false, type: 'number', unit: 'kW', desc: 'Maximale Leistung Gestern'});
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Gesamt', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Heute', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Monat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.CO2.Jahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Eingesparte CO2-Emissionen'});
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Gesamt', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Heute', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Monat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt.Baeume.Jahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Entspricht gepflanzten Bäumen'});
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vortag', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume Gestern'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vortag', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 Gestern'});
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vormonat', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume vorigen Monats'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vormonat', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 vorigen Monats'});
          
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.Baeume_Vorjahr', 0, {read: true, write: false, type: 'number', unit: 'Stück', desc: 'Berechnungswert Bäume voriges Jahr'});
                              createState( pfad +'Anlagen.'+ anlage['id'] +'.Umwelt._Berechnung.CO2_Vorjahr', 0, {read: true, write: false, type: 'number', unit: unit.unit, desc: 'Berechnungswert CO2 voriges Jahr'});
          
                          });
          
                      }
          
                  });
          
                  // Reset Anlagen einlesen
                  if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) setState( pfad +'Konfiguration.AnlagenEinlesen', false, true );
          
              } else log( 'Es wurde kein API Schlüssel angegeben.', "error" );
          
          }
          
          //Datum und Uhrzeit
          function getTime(){
              
              let data = new Object();
              var d = new Date();
          
              data['stunde']  = ( '0'+ d.getHours() ).substr(-2);
              data['minute']  = ( '0'+ d.getMinutes() ).substr(-2);
              data['sekunde'] = ( '0'+ d.getSeconds() ).substr(-2);;
              data['tag']     = d.getDate();
              data['monat']   = ( '0'+ ( d.getMonth() +1 ) ).substr(-2);
              data['jahr']    = d.getFullYear();
              data['ltm']     = (new Date( d.getFullYear(), d.getMonth()+1, 0 )).getDate();
          
              return data;
          
          }
          
          //Einheiten auslesen
          function getUnits( u ){
          
              var unit = new Object();
              if( u == 0 ){
          
                  unit['api'] = "Metrics",
                  unit['unit'] = "Kg"
          
              } else if ( u == 1 ){
          
                  unit['api'] = "Imperial",
                  unit['unit'] = "Lb"
          
              };
          
              return unit;
          
          }
          
          function getActivePlants(){
          
              let anlagen = new Array;
              let cache = $('channel[state.id='+ pfad +'Anlagen.*.Status]');
          
              cache.each(function(obj){
                  if( existsState( obj ) && getState( obj ).val == 'Active' ){
                      var id = obj.split(".");
                      anlagen.push( id[ (id.length-2) ] );
                  }
              });
          
              return anlagen;
          
          };
          
          // Tägliche Jobs
          schedule('0 0 * * *', function () {
          
              let plants = getActivePlants();
              plants.forEach( function(plant){
          
                  if(debug) log( 'Setze tägliche Berechnungsdaten für die Anlage '+ plant );
          
                  setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Gestern', getState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute' ).val, true );  
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vortag', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
          
                  //Zähler zurücksetzen
                  setState( pfad +'Anlagen.'+ plant +'.Erzeugung.Max_Heute', 0, true );
          
                  //Anlagendaten einlesen
                  systemdaten();
              
              });
          
          });
          
          // Monatliche Jobs
          schedule('0 0 1 * *', function () {
          
              let plants = getActivePlants();
              plants.forEach( function(plant){
          
                  if(debug) log( 'Setze monatliche Berechnungsdaten für die Anlage '+ plant );
          
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vormonat', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
          
                  //Zähler zurücksetzen
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Monat', 0, true );
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Monat', 0, true );
              
              });
          
          });
          
          // Jährliche Jobs
          schedule('0 0 1 1 *', function () {
          
              let plants = getActivePlants();
              plants.forEach( function(plant){
          
                  if(debug) log( 'Setze jährliche Berechnungsdaten für die Anlage '+ plant );
          
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.Baeume_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Gesamt' ).val, true );
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt._Berechnung.CO2_Vorjahr', getState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Gesamt' ).val, true );
          
                  //Zähler zurücksetzen
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt.Baeume.Jahr', 0, true );
                  setState( pfad +'Anlagen.'+ plant +'.Umwelt.CO2.Jahr', 0, true );
              
              });
          
          });
          
          //Datenpunkte prüfen
          function checkStates( state ){
          
              if( existsState( state ) === false ){
          
                  log('Initialeinreichtung wird durchgeführt. Bitte den API Key in der Konfiguration eingeben.', 'warn');
                  createStates( pfad );
                  return false;
          
              } else return true;
          
          };
          
          // Anlagen einlesen wenn erzwungen
          schedule('* * * * *', function(){
              if( getState( pfad +'Konfiguration.AnlagenEinlesen' ).val === true ) systemdaten();
          });
          
          //Datenpunkte erstellen
          function createStates( pfad ){
          
              let einheiten = ['Metrisch', 'Imperial'];
          
              createState( pfad +'Konfiguration.APIKey', 0, {read: true, write: true, type: 'string', desc: 'Solaredge API Schlüssel'});
              createState( pfad +'Konfiguration.AnlagenEinlesen', true, {read: true, write: true, type: 'boolean', desc: 'Anlagen neu einlesen'});
              createState( pfad +'Konfiguration.Einheit', 0, {read: true, write: true, type: 'number', desc: 'Metrische oder Imperiale Einheiten', states: einheiten});
              
          }
          
          arteckA Offline
          arteckA Offline
          arteck
          Developer Most Active
          schrieb am zuletzt editiert von
          #4

          @tobstar währe nicht besser wenn du den adapter erweitern würdest ..

          zigbee hab ich, zwave auch, nuc's genauso und HA auch

          T 1 Antwort Letzte Antwort
          0
          • wendy2702W wendy2702

            @smarteppi Das ist ein Script und kein Adapter.

            Das muss man als Script in die JavaScript Instanz eingefügt werden.

            S Offline
            S Offline
            smarteppi
            schrieb am zuletzt editiert von
            #5

            @wendy2702 Verstanden danke!

            1 Antwort Letzte Antwort
            0
            • arteckA arteck

              @tobstar währe nicht besser wenn du den adapter erweitern würdest ..

              T Offline
              T Offline
              TobStar
              schrieb am zuletzt editiert von
              #6

              @arteck hab leider keine Ahnung von der Adapter-Entwicklung. Hatte mich mal daran versucht einen Adapter zu bauen aber das dann letztlich auch aus Zeitgründen wieder fallen gelassen. Vielleicht schaue ich es mir nochmal an und teste das irgendwann mal.

              Aktuell bin ich noch dabei das auszubauen und Batterie / Energy Meter zu integrieren.

              arteckA 1 Antwort Letzte Antwort
              0
              • T TobStar

                @arteck hab leider keine Ahnung von der Adapter-Entwicklung. Hatte mich mal daran versucht einen Adapter zu bauen aber das dann letztlich auch aus Zeitgründen wieder fallen gelassen. Vielleicht schaue ich es mir nochmal an und teste das irgendwann mal.

                Aktuell bin ich noch dabei das auszubauen und Batterie / Energy Meter zu integrieren.

                arteckA Offline
                arteckA Offline
                arteck
                Developer Most Active
                schrieb am zuletzt editiert von
                #7

                @tobstar na ja das was du da im script machst kannst auch in dem schon vorhandenen Adapter intergrieren..
                und ist dann auch noch zentral.. für alle.. halt im adapter

                zigbee hab ich, zwave auch, nuc's genauso und HA auch

                1 Antwort Letzte Antwort
                0
                • B Offline
                  B Offline
                  bitwicht
                  schrieb am zuletzt editiert von
                  #8

                  Hallo.

                  Danke für das Script.

                  Stimmen die Werte bei Euch?
                  Bei mir weichen die abgeholten Daten im iobroker extrem von denen in der SE-App ab?

                  lg
                  Bit

                  1 Antwort Letzte Antwort
                  0
                  • B Offline
                    B Offline
                    bitwicht
                    schrieb am zuletzt editiert von
                    #9

                    Bin weiter.

                    Das Script geht, aber mit einem Akku passen die Werte bei mir nur am Ende eines Tages.
                    Anscheinend wird die Ladung in der Web-App sofort und in der API erst nach Entladung in der Gesamtsumme angezeigt.

                    1 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    521

                    Online

                    32.6k

                    Benutzer

                    82.2k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe