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. Eigenverbrauchsoptimierung PV - Anlage - Anfänger

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.4k

Eigenverbrauchsoptimierung PV - Anlage - Anfänger

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
10 Beiträge 3 Kommentatoren 544 Aufrufe 2 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.
  • Johannes BauerstatterJ Offline
    Johannes BauerstatterJ Offline
    Johannes Bauerstatter
    schrieb am zuletzt editiert von Johannes Bauerstatter
    #1

    Hallo, bräuchte bitte wieder mal Eure Hilfe.

    folgendes Script berechnet mir ob ich momentan Einspeise bzw. wieviel Energie ich gerade beziehe:

    const Gesamt = [
    '0_userdata.0.Verbräuche.Strom_1OG',
    '0_userdata.0.Verbräuche.Strom_EG',
    '0_userdata.0.Verbräuche.Photovoltaik',
    '0_userdata.0.Verbräuche.Strom_Heizung',
    '0_userdata.0.Verbräuche.Strom_Garage_Keller'
    
    ];
      
    on(Gesamt, function (obj) 
    {
        setState('0_userdata.0.Verbräuche.Gesamtverbrauch', 
        ( getState('0_userdata.0.Verbräuche.Strom_1OG').val
        + getState('0_userdata.0.Verbräuche.Strom_EG').val
        + getState('0_userdata.0.Verbräuche.Strom_Heizung').val
        + getState('0_userdata.0.Verbräuche.Strom_Garage_Keller').val         
        - getState('0_userdata.0.Verbräuche.Photovoltaik').val
        ));
    })
    

    In meinem Puffer steckt ein Heizstab den ich mittels Schalter einschalten kann:
    21b4ca09-e144-492d-a8a5-9033a8507b43-image.png

    Jetzt soll ein Script die Phasen der Heizstäbe einschalten sobald jeweils 700W über sind.

    Einspeisung >700W -> P1 ein -> Einspeisung fällt auf 100W (da Heizstab ca. 600W) verbraucht -> P1 würde ausschalten -> Einspeisung steigt wieder auf 700W -> Heizstab wieder ein -> .... wie kann ich das verhindern bzw. wie schalte ich dann P2. P2 müsste einschalten wenn P1 + Einspeisung >700W ist.

    HomoranH 1 Antwort Letzte Antwort
    0
    • Johannes BauerstatterJ Johannes Bauerstatter

      Hallo, bräuchte bitte wieder mal Eure Hilfe.

      folgendes Script berechnet mir ob ich momentan Einspeise bzw. wieviel Energie ich gerade beziehe:

      const Gesamt = [
      '0_userdata.0.Verbräuche.Strom_1OG',
      '0_userdata.0.Verbräuche.Strom_EG',
      '0_userdata.0.Verbräuche.Photovoltaik',
      '0_userdata.0.Verbräuche.Strom_Heizung',
      '0_userdata.0.Verbräuche.Strom_Garage_Keller'
      
      ];
        
      on(Gesamt, function (obj) 
      {
          setState('0_userdata.0.Verbräuche.Gesamtverbrauch', 
          ( getState('0_userdata.0.Verbräuche.Strom_1OG').val
          + getState('0_userdata.0.Verbräuche.Strom_EG').val
          + getState('0_userdata.0.Verbräuche.Strom_Heizung').val
          + getState('0_userdata.0.Verbräuche.Strom_Garage_Keller').val         
          - getState('0_userdata.0.Verbräuche.Photovoltaik').val
          ));
      })
      

      In meinem Puffer steckt ein Heizstab den ich mittels Schalter einschalten kann:
      21b4ca09-e144-492d-a8a5-9033a8507b43-image.png

      Jetzt soll ein Script die Phasen der Heizstäbe einschalten sobald jeweils 700W über sind.

      Einspeisung >700W -> P1 ein -> Einspeisung fällt auf 100W (da Heizstab ca. 600W) verbraucht -> P1 würde ausschalten -> Einspeisung steigt wieder auf 700W -> Heizstab wieder ein -> .... wie kann ich das verhindern bzw. wie schalte ich dann P2. P2 müsste einschalten wenn P1 + Einspeisung >700W ist.

      HomoranH Nicht stören
      HomoranH Nicht stören
      Homoran
      Global Moderator Administrators
      schrieb am zuletzt editiert von
      #2

      @johannes-bauerstatter sagte in Eigenverbrauchsoptimierung PV - Anlage - Anfänger:

      wie kann ich das verhindern

      indem du mit einer Variablen arbeitest und diese ja nach bereits laufenden Phasen neu berechnest:

      @johannes-bauerstatter sagte in Eigenverbrauchsoptimierung PV - Anlage - Anfänger:

      wenn P1 + Einspeisung >700W

      kein Support per PN! - Fragen im Forum stellen - es gibt fast nichts, was nicht auch für andere interessant ist.

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

      der Installationsfixer: curl -fsL https://iobroker.net/fix.sh | bash -

      Johannes BauerstatterJ 1 Antwort Letzte Antwort
      0
      • HomoranH Homoran

        @johannes-bauerstatter sagte in Eigenverbrauchsoptimierung PV - Anlage - Anfänger:

        wie kann ich das verhindern

        indem du mit einer Variablen arbeitest und diese ja nach bereits laufenden Phasen neu berechnest:

        @johannes-bauerstatter sagte in Eigenverbrauchsoptimierung PV - Anlage - Anfänger:

        wenn P1 + Einspeisung >700W

        Johannes BauerstatterJ Offline
        Johannes BauerstatterJ Offline
        Johannes Bauerstatter
        schrieb am zuletzt editiert von
        #3

        @homoran
        Würde das dann so funktionieren?:

        const Gesamt = [
        '0_userdata.0.Verbräuche.Strom_1OG',
        '0_userdata.0.Verbräuche.Strom_EG',
        '0_userdata.0.Verbräuche.Photovoltaik',
        '0_userdata.0.Verbräuche.Strom_Heizung',
        '0_userdata.0.Verbräuche.Strom_Garage_Keller'
        ];
          
        on(Gesamt, function (obj) 
        {
            setState('0_userdata.0.Verbräuche.Gesamtverbrauch', 
            ( getState('0_userdata.0.Verbräuche.Strom_1OG').val
            + getState('0_userdata.0.Verbräuche.Strom_EG').val
            + getState('0_userdata.0.Verbräuche.Strom_Heizung').val
            + getState('0_userdata.0.Verbräuche.Strom_Garage_Keller').val         
            - getState('0_userdata.0.Verbräuche.Photovoltaik').val
            ));
        })
        
        
        const Verbrauch = ['0_userdata.0.Verbräuche.Gesamtverbrauch'];
        var P1 = 0;
        var P2 = 0;
        
        on (Verbrauch, function (obj) 
        {
        if (getState('0_userdata.0.Verbräuche.Gesamtverbrauch').val < -700 && P1 == 0) 
            {var P1 = 1;
            setTimeout(function() {setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', true );}, 900000); 
            } 
        else    setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', false );
                var P1 = 0;
        
        
        if (getState('0_userdata.0.Verbräuche.Gesamtverbrauch').val < -700 && P1 == 1) 
            {var P2 = 1;
            setTimeout(function() {setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', true ); }, 900000);    
            } 
        else    setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', false );
                var P2 = 0;
        
        
        if (getState('0_userdata.0.Verbräuche.Gesamtverbrauch').val < -700 && P2 == 1) 
            {
            setTimeout(function() {setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', true );}, 900000);
            } 
        else    setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', false ); 
        });
        
        paul53P 1 Antwort Letzte Antwort
        0
        • Johannes BauerstatterJ Johannes Bauerstatter

          @homoran
          Würde das dann so funktionieren?:

          const Gesamt = [
          '0_userdata.0.Verbräuche.Strom_1OG',
          '0_userdata.0.Verbräuche.Strom_EG',
          '0_userdata.0.Verbräuche.Photovoltaik',
          '0_userdata.0.Verbräuche.Strom_Heizung',
          '0_userdata.0.Verbräuche.Strom_Garage_Keller'
          ];
            
          on(Gesamt, function (obj) 
          {
              setState('0_userdata.0.Verbräuche.Gesamtverbrauch', 
              ( getState('0_userdata.0.Verbräuche.Strom_1OG').val
              + getState('0_userdata.0.Verbräuche.Strom_EG').val
              + getState('0_userdata.0.Verbräuche.Strom_Heizung').val
              + getState('0_userdata.0.Verbräuche.Strom_Garage_Keller').val         
              - getState('0_userdata.0.Verbräuche.Photovoltaik').val
              ));
          })
          
          
          const Verbrauch = ['0_userdata.0.Verbräuche.Gesamtverbrauch'];
          var P1 = 0;
          var P2 = 0;
          
          on (Verbrauch, function (obj) 
          {
          if (getState('0_userdata.0.Verbräuche.Gesamtverbrauch').val < -700 && P1 == 0) 
              {var P1 = 1;
              setTimeout(function() {setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', true );}, 900000); 
              } 
          else    setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', false );
                  var P1 = 0;
          
          
          if (getState('0_userdata.0.Verbräuche.Gesamtverbrauch').val < -700 && P1 == 1) 
              {var P2 = 1;
              setTimeout(function() {setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', true ); }, 900000);    
              } 
          else    setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', false );
                  var P2 = 0;
          
          
          if (getState('0_userdata.0.Verbräuche.Gesamtverbrauch').val < -700 && P2 == 1) 
              {
              setTimeout(function() {setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', true );}, 900000);
              } 
          else    setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', false ); 
          });
          
          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #4

          @johannes-bauerstatter sagte: Würde das dann so funktionieren?:

          Ohne die Funktionalität zu beurteilen, sollten einige Korrekturen erfolgen:

          const idVerbrauch = '0_userdata.0.Verbräuche.Gesamtverbrauch';
          var P1 = 0;
          var P2 = 0;
           
          on (idVerbrauch, function (dp) {
             let verbrauch = dp.state.val;
             if (verbrauch < -700 && P1 == 0) {
                P1 = 1;
                setTimeout(function() {
                   setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', true);
                }, 900000); 
             } else {
                setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', false );
                P1 = 0;
             }
           
             if (verbrauch < -700 && P1 == 1) {
                P2 = 1;
                setTimeout(function() {
                   setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', true ); 
                }, 900000);    
             } else {
                setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', false );
                P2 = 0;
             }
           
             if (verbrauch < -700 && P2 == 1) {
                setTimeout(function() { 
                   setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', true ); 
                }, 900000);
             } else {
                setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', false ); 
             }
          });
          

          Was schalten relais1...3?

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

          Johannes BauerstatterJ 1 Antwort Letzte Antwort
          0
          • paul53P paul53

            @johannes-bauerstatter sagte: Würde das dann so funktionieren?:

            Ohne die Funktionalität zu beurteilen, sollten einige Korrekturen erfolgen:

            const idVerbrauch = '0_userdata.0.Verbräuche.Gesamtverbrauch';
            var P1 = 0;
            var P2 = 0;
             
            on (idVerbrauch, function (dp) {
               let verbrauch = dp.state.val;
               if (verbrauch < -700 && P1 == 0) {
                  P1 = 1;
                  setTimeout(function() {
                     setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', true);
                  }, 900000); 
               } else {
                  setState('esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1', false );
                  P1 = 0;
               }
             
               if (verbrauch < -700 && P1 == 1) {
                  P2 = 1;
                  setTimeout(function() {
                     setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', true ); 
                  }, 900000);    
               } else {
                  setState('esphome.0.246F287C8DA4.Switch.2875680689.heizstab_relais_2', false );
                  P2 = 0;
               }
             
               if (verbrauch < -700 && P2 == 1) {
                  setTimeout(function() { 
                     setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', true ); 
                  }, 900000);
               } else {
                  setState('esphome.0.246F287C8DA4.Switch.2875680688.heizstab_relais_3', false ); 
               }
            });
            

            Was schalten relais1...3?

            Johannes BauerstatterJ Offline
            Johannes BauerstatterJ Offline
            Johannes Bauerstatter
            schrieb am zuletzt editiert von
            #5

            @paul53 Danke für die Korrekturen.

            Ich habe einen 3phasigen Heizstab und die Relais schalten jeweils eine Phase.

            paul53P 1 Antwort Letzte Antwort
            0
            • Johannes BauerstatterJ Johannes Bauerstatter

              @paul53 Danke für die Korrekturen.

              Ich habe einen 3phasigen Heizstab und die Relais schalten jeweils eine Phase.

              paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #6

              @johannes-bauerstatter
              Was sollen die Timeout von 15 Minuten bewirken?

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              Johannes BauerstatterJ 1 Antwort Letzte Antwort
              0
              • paul53P paul53

                @johannes-bauerstatter
                Was sollen die Timeout von 15 Minuten bewirken?

                Johannes BauerstatterJ Offline
                Johannes BauerstatterJ Offline
                Johannes Bauerstatter
                schrieb am zuletzt editiert von
                #7

                @paul53 Schwankungen von seitens der PV - Anlage abfangen, damit nicht zu viele Schaltvorgänge auf den Relais passieren.

                paul53P 1 Antwort Letzte Antwort
                0
                • Johannes BauerstatterJ Johannes Bauerstatter

                  @paul53 Schwankungen von seitens der PV - Anlage abfangen, damit nicht zu viele Schaltvorgänge auf den Relais passieren.

                  paul53P Offline
                  paul53P Offline
                  paul53
                  schrieb am zuletzt editiert von paul53
                  #8

                  @johannes-bauerstatter
                  Du möchtest nacheinander jeweils eine Phase zuschalten, wenn der resultierende Überschuss 15 Minuten lang über 700 W beträgt?
                  Dann versuche es mal so:

                  const idVerbrauch = '0_userdata.0.Verbräuche.Gesamtverbrauch';
                  const idR1 = 'esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1';
                  const idR2 = 'esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_2';
                  const idR3 = 'esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_3';
                  
                  var p1, p2, p3 = false;
                  var delay = null;
                  
                  on(idVerbrauch, function(dp) {
                      if(dp.state.val < -700) {
                          if(!delay) {
                              delay = setTimeout(function() {
                                  if(!p1) { 
                                      setState(idR1, true);
                                      p1 = true;
                                  } else if(!p2) {
                                      setState(idR2, true);
                                      p2 = true;
                                  } else if(!p3) {
                                      setState(idR3, true);
                                      p3 = true;
                                  }
                                  delay = null;
                              }, 900000);
                          }
                      } else {
                          if(delay) clearTimeout(delay);
                          delay = null;
                          if(dp.state.val > -50) {
                              if(p3) {
                                  setState(idR3, false);
                                  p3 = false;
                              } else if(p2) {
                                  setState(idR2, false);
                                  p2 = false;
                              } else if(p1) {
                                  setState(idR1, false);
                                  p1 = false;
                              }
                          }
                      }
                  });
                  

                  Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                  Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                  Johannes BauerstatterJ 1 Antwort Letzte Antwort
                  0
                  • paul53P paul53

                    @johannes-bauerstatter
                    Du möchtest nacheinander jeweils eine Phase zuschalten, wenn der resultierende Überschuss 15 Minuten lang über 700 W beträgt?
                    Dann versuche es mal so:

                    const idVerbrauch = '0_userdata.0.Verbräuche.Gesamtverbrauch';
                    const idR1 = 'esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_1';
                    const idR2 = 'esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_2';
                    const idR3 = 'esphome.0.246F287C8DA4.Switch.2875680690.heizstab_relais_3';
                    
                    var p1, p2, p3 = false;
                    var delay = null;
                    
                    on(idVerbrauch, function(dp) {
                        if(dp.state.val < -700) {
                            if(!delay) {
                                delay = setTimeout(function() {
                                    if(!p1) { 
                                        setState(idR1, true);
                                        p1 = true;
                                    } else if(!p2) {
                                        setState(idR2, true);
                                        p2 = true;
                                    } else if(!p3) {
                                        setState(idR3, true);
                                        p3 = true;
                                    }
                                    delay = null;
                                }, 900000);
                            }
                        } else {
                            if(delay) clearTimeout(delay);
                            delay = null;
                            if(dp.state.val > -50) {
                                if(p3) {
                                    setState(idR3, false);
                                    p3 = false;
                                } else if(p2) {
                                    setState(idR2, false);
                                    p2 = false;
                                } else if(p1) {
                                    setState(idR1, false);
                                    p1 = false;
                                }
                            }
                        }
                    });
                    
                    Johannes BauerstatterJ Offline
                    Johannes BauerstatterJ Offline
                    Johannes Bauerstatter
                    schrieb am zuletzt editiert von Johannes Bauerstatter
                    #9

                    @paul53 Danke für deinen Code.

                    Habe mich leider schlecht ausgedrückt:

                    Ziel:
                    wenn idVerbrauch <-700W dann Relais1 ein; sollte es kurzzeitig auf -680W und innerhalb von 15min wieder über <-700W steigen, dann soll das Relais 1 nicht ausschalten -> 15min in denen der idVerbrauch kurz unter -<700W fallen darf.

                    Ablauf:

                    idVerbrauch >-700
                    -> Relais1 ein
                    -> durch Relais1 ein fällt der idVerbrauch auf ca. -100W
                    -> sobald wieder >-700W erreicht sind und Relais1 noch ein ist
                    -> soll Relais2 einschalten
                    -> durch Relais1 und Relais 2 ein fällt der idVerbrauch wieder auf ca. -100W
                    -> sobald wieder >-700W erreicht sind und Relais1 und Relais2 noch ein ist
                    -> soll Relais3 einschalten

                    Ausschalten in umgekehrter Reihenfolge -> zuerst Relais3 dann Relais2 dann Relais1

                    Der erste von dir korrigierte Code sollte dies bereits leisten denk ich? Bin leider erst wieder am WE zu Hause zum testen.

                    Johannes BauerstatterJ 1 Antwort Letzte Antwort
                    0
                    • Johannes BauerstatterJ Johannes Bauerstatter

                      @paul53 Danke für deinen Code.

                      Habe mich leider schlecht ausgedrückt:

                      Ziel:
                      wenn idVerbrauch <-700W dann Relais1 ein; sollte es kurzzeitig auf -680W und innerhalb von 15min wieder über <-700W steigen, dann soll das Relais 1 nicht ausschalten -> 15min in denen der idVerbrauch kurz unter -<700W fallen darf.

                      Ablauf:

                      idVerbrauch >-700
                      -> Relais1 ein
                      -> durch Relais1 ein fällt der idVerbrauch auf ca. -100W
                      -> sobald wieder >-700W erreicht sind und Relais1 noch ein ist
                      -> soll Relais2 einschalten
                      -> durch Relais1 und Relais 2 ein fällt der idVerbrauch wieder auf ca. -100W
                      -> sobald wieder >-700W erreicht sind und Relais1 und Relais2 noch ein ist
                      -> soll Relais3 einschalten

                      Ausschalten in umgekehrter Reihenfolge -> zuerst Relais3 dann Relais2 dann Relais1

                      Der erste von dir korrigierte Code sollte dies bereits leisten denk ich? Bin leider erst wieder am WE zu Hause zum testen.

                      Johannes BauerstatterJ Offline
                      Johannes BauerstatterJ Offline
                      Johannes Bauerstatter
                      schrieb am zuletzt editiert von Johannes Bauerstatter
                      #10

                      Läuft noch nicht richtig. In Arbeit.

                      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

                      809

                      Online

                      32.4k

                      Benutzer

                      81.6k

                      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