Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Wer findet den Fehler im Skript (ZisternenNachbefüllung)

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Wer findet den Fehler im Skript (ZisternenNachbefüllung)

    This topic has been deleted. Only users with topic management privileges can see it.
    • K
      keineAhnungvonProgrmieren last edited by

      Hallo zusammen,
      ich habe nach mehreren Stunden mit ChatGPT folgendes Skript erstellt. Leider funktioniert es noch nicht wie gewünscht.
      Anforderungen:
      wenn Füllstand länger wie 1min kleiner 5% dann schalte Shelly auf true für mindestens 45sec.
      Aktualiesiere die berechnung alle 15sec.
      Zusätzlich soll der shelly falls er extern auf true gestellt wurde alle 4 Zyklen auf false gestellt werden.

      alle funktioniert scheinbar aber falls der shelly extern auf true gestellt wird, wird er nicht automatisch auf false gestellt.

      Habt ihr eine Idee wo da was falsch programiert ist?

      einfach mit Copypaste rausskopiert:

      // Konfiguration
      const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne
      const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter
      const threshold = 5; // Schwellenwert auf 5% gesetzt
      const checkInterval = 15000; // 15 Sekunden
      const activateDuration = 45000; // Standard: 45 Sekunden
      const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird

      let shellyActive = false;
      let cycleCount = 0;

      // Funktion zum periodischen Auslesen des Tankfüllstands
      function readTankLevel() {
      // Tankfüllstand auslesen
      const tankLevel = getState(tankLevelId);
      if (tankLevel) {
      const tankLevelValue = parseFloat(tankLevel.val);
      console.log('Tank Level:', tankLevelValue);

          if (tankLevelValue < threshold) {
              // Schalte den Shelly Plug S ein und setze den Timer
              if (!shellyActive) {
                  shellyActive = true;
                  setState(shellyPlugId, true);
                  console.log('Shelly Plug S aktiviert');
                  setTimeout(() => {
                      // Deaktiviere den Shelly Plug S nach Ablauf der Zeit
                      shellyActive = false;
                      setState(shellyPlugId, false);
                      console.log('Shelly Plug S deaktiviert');
                  }, activateDuration);
              }
              cycleCount++;
              if (cycleCount >= maxCyclesBeforeShutdown) {
                  // Deaktiviere den Shelly Plug S nach der maximalen Anzahl von Zyklen
                  shellyActive = false;
                  setState(shellyPlugId, false);
                  console.log('Shelly Plug S deaktiviert nach', maxCyclesBeforeShutdown, 'Zyklen');
                  cycleCount = 0;
              }
          } else {
              // Wenn der Füllstand den Schwellenwert überschreitet, setze den Zählzyklus zurück
              cycleCount = 0;
          }
      }
      

      }

      // Periodisch den Tankfüllstand auslesen
      setInterval(() => {
      console.log('--- Neuer Zyklus ---');
      readTankLevel();
      }, checkInterval);

      DJMarc75 Ro75 T paul53 4 Replies Last reply Reply Quote 0
      • DJMarc75
        DJMarc75 @keineAhnungvonProgrmieren last edited by

        @keineahnungvonprogrmieren sagte in Wer findet den Fehler im Skript (ZisternenNachbefüllung):

        Habt ihr eine Idee wo da was falsch programiert ist?

        Pack mal bitte das ganze Skript in Codetags - dann kann vll geholfen werden 🙂

        1 Reply Last reply Reply Quote 0
        • Ro75
          Ro75 @keineAhnungvonProgrmieren last edited by Ro75

          @keineahnungvonprogrmieren sagte in Wer findet den Fehler im Skript (ZisternenNachbefüllung):

          // Tankfüllstand auslesen
          const tankLevel = getState(tankLevelId);

          Versuche mal so:

           var tankLevel = getState(tankLevelId).val;
          

          und

          if (tankLevel) {
          const tankLevelValue = parseFloat(tankLevel.val);

          if (tankLevel) {
          var tankLevelValue = parseFloat(tankLevel);
          

          Habe nur mal kurz überflogen...
          Ro75.

          1 Reply Last reply Reply Quote 0
          • Homoran
            Homoran Global Moderator Administrators last edited by

            Wo wird denn hier im showroom ein nützliches Projekt vorgestellt?

            ich schieb das mal nach javascript.

            1 Reply Last reply Reply Quote 0
            • T
              ticaki Developer @keineAhnungvonProgrmieren last edited by

              @keineahnungvonprogrmieren
              Pack das mal alles in code tags

              K 1 Reply Last reply Reply Quote 0
              • K
                keineAhnungvonProgrmieren @ticaki last edited by

                @ticaki ; @Ro75
                Habe mal versucht die änderungen einzubauen, ist das so gemeint?

                Leider funktioniert es noch nicht so wie gedacht.
                Habe den shelly aus testgründen in der Instanz auf true gestellt, gehe davon aus das das skript Ihn dann auf false stellt.

                // Konfiguration
                const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne
                const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter
                const threshold = 5; // Schwellenwert auf 5% gesetzt
                const checkInterval = 15000; // 15 Sekunden
                const activateDuration = 45000; // Standard: 45 Sekunden
                const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird
                
                let shellyActive = false;
                let cycleCount = 0;
                
                // Funktion zum periodischen Auslesen des Tankfüllstands
                function readTankLevel() {
                    // Tankfüllstand auslesen
                     const tankLevel = getState(tankLevelId).val; 
                    
                
                if (tankLevel) {
                
                const tankLevelValue = parseFloat(tankLevel);
                        console.log('Tank Level:', tankLevelValue);
                
                        if (tankLevelValue < threshold) {
                            // Schalte den Shelly Plug S ein und setze den Timer
                            if (!shellyActive) {
                                shellyActive = true;
                                setState(shellyPlugId, true);
                                console.log('Shelly Plug S aktiviert');
                                setTimeout(() => {
                                    // Deaktiviere den Shelly Plug S nach Ablauf der Zeit
                                    shellyActive = false;
                                    setState(shellyPlugId, false);
                                    console.log('Shelly Plug S deaktiviert');
                                }, activateDuration);
                            }
                            cycleCount++;
                            if (cycleCount >= maxCyclesBeforeShutdown) {
                                // Deaktiviere den Shelly Plug S nach der maximalen Anzahl von Zyklen
                                shellyActive = false;
                                setState(shellyPlugId, false);
                                console.log('Shelly Plug S deaktiviert nach', maxCyclesBeforeShutdown, 'Zyklen');
                                cycleCount = 0;
                            }
                        } else {
                            // Wenn der Füllstand den Schwellenwert überschreitet, setze den Zählzyklus zurück
                            cycleCount = 0;
                        }
                    }
                }
                
                // Periodisch den Tankfüllstand auslesen
                setInterval(() => {
                    console.log('--- Neuer Zyklus ---');
                    readTankLevel();
                }, checkInterval);
                
                
                K T Ro75 3 Replies Last reply Reply Quote 0
                • K
                  keineAhnungvonProgrmieren @keineAhnungvonProgrmieren last edited by

                  @keineahnungvonprogrmieren
                  Sorry natürlich in objekten 😉

                  1 Reply Last reply Reply Quote 0
                  • T
                    ticaki Developer @keineAhnungvonProgrmieren last edited by ticaki

                    Falsch läuft das du alle 15 Sekunden den Füllstand prüfst und wenn true schaltest du den shelly an und dann prüfst du 15 Sekunden später auf den Füllstand und schaltest den Shelly auf True und dann kommst drauf an wer zu erst malt. Jetzt kommt dein Timeout zurück und schaltet den Shelly ab und dann prüfst du den Füllstand und schaltest den Shelly auf true 🙂

                    Zeit des umschließenden Intervals auf 1 Minute setzen.

                    1 Reply Last reply Reply Quote 0
                    • Ro75
                      Ro75 @keineAhnungvonProgrmieren last edited by

                      @keineahnungvonprogrmieren

                      // Konfiguration
                      const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne
                      const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter
                      const threshold = 5; // Schwellenwert auf 5% gesetzt
                      const activateDuration = 45000; // Standard: 45 Sekunden
                      const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird
                       
                      let shellyActive = false;
                      let cycleCount = 0;
                       
                      // Funktion zum periodischen Auslesen des Tankfüllstands
                      function readTankLevel() {
                      if (tankLevel) {
                       
                      var tankLevelValue = parseFloat(tankLevel);
                              console.log('Tank Level:', tankLevelValue);
                       
                              if (tankLevelValue < threshold) {
                                  // Schalte den Shelly Plug S ein und setze den Timer
                                  if (!shellyActive) {
                                      shellyActive = true;
                                      setState(shellyPlugId, true);
                                      console.log('Shelly Plug S aktiviert');
                                      setTimeout(() => {
                                          // Deaktiviere den Shelly Plug S nach Ablauf der Zeit
                                          shellyActive = false;
                                          setState(shellyPlugId, false);
                                          console.log('Shelly Plug S deaktiviert');
                                      }, activateDuration);
                                  }
                                  cycleCount++;
                                  if (cycleCount >= maxCyclesBeforeShutdown) {
                                      // Deaktiviere den Shelly Plug S nach der maximalen Anzahl von Zyklen
                                      shellyActive = false;
                                      setState(shellyPlugId, false);
                                      console.log('Shelly Plug S deaktiviert nach', maxCyclesBeforeShutdown, 'Zyklen');
                                      cycleCount = 0;
                                  }
                              } else {
                                  // Wenn der Füllstand den Schwellenwert überschreitet, setze den Zählzyklus zurück
                                  cycleCount = 0;
                              }
                          }
                      }
                       
                      on(tankLevelId, function(dp) {
                          // Tankfüllstand auslesen
                          var tankLevel = dp.state.val; 
                      
                          console.log('--- Neuer Zyklus ---');
                          readTankLevel();
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • paul53
                        paul53 @keineAhnungvonProgrmieren last edited by paul53

                        @keineahnungvonprogrmieren sagte: soll der shelly falls er extern auf true gestellt wurde alle 4 Zyklen auf false gestellt werden.

                        Vorschlag mit Shedule und Trigger auf den Shelly:

                        // Konfiguration
                        const tankLevelId = '0_userdata.0.Füllstand_Hauptzisterne'; // Füllstand Hauptzisterne
                        const shellyPlugId = 'shelly.3.shellyplusplugs#d4d4daf36728#1.Relay0.Switch'; // Schalter
                        const threshold = 5; // Schwellenwert auf 5% gesetzt
                        const checkInterval = 15000; // 15 Sekunden
                        const activateDuration = 45000; // Standard: 45 Sekunden
                        const maxCyclesBeforeShutdown = 4; // Max. Anzahl der Zyklen, bevor der Shelly Plug deaktiviert wird
                         
                        let shellyActive = getState(shellyPlugId).val;
                        var timer = null;
                         
                        // Funktion zum periodischen Auslesen des Tankfüllstands
                        function readTankLevel() {
                            // Tankfüllstand auslesen
                            const tankLevel = parseFloat(getState(tankLevelId).val); 
                            if (tankLevel) {
                                console.log('Tank Level:', tankLevel);
                                if (tankLevel < threshold) {
                                    // Schalte den Shelly Plug S ein und setze den Timer
                                    if (!shellyActive) {
                                        setState(shellyPlugId, true);
                                        console.log('Shelly Plug S aktiviert');
                                    } 
                                } else if(shellyActive && !timer) {
                                    timer = setTimeout(() => {
                                        // Deaktiviere den Shelly Plug S nach Ablauf der Zeit
                                        setState(shellyPlugId, false);
                                        console.log('Shelly Plug S deaktiviert');
                                        timer = null;
                                    }, activateDuration);
                                }
                            }
                        }
                         
                        // Periodisch den Tankfüllstand auslesen
                        schedule('*/15 * * * * *', function() {
                            console.log('--- Neuer Zyklus ---');
                            readTankLevel();
                        });
                        
                        on(shellyPlugId, function(dp) {
                            shellyActive = dp.state.val;
                            if(shellyActive && dp.state.c != scriptName) {
                                setTimeout(function() {
                                    setState(shellyPlugId, false);
                                }, maxCyclesBeforeShutdown * checkInterval);
                            }
                        });
                        

                        @keineahnungvonprogrmieren sagte in Wer findet den Fehler im Skript (ZisternenNachbefüllung):

                        kleiner 5% dann schalte Shelly auf true für mindestens 45sec.

                        K 1 Reply Last reply Reply Quote 0
                        • K
                          keineAhnungvonProgrmieren @paul53 last edited by

                          @paul53

                          Mit dem skript funktioniert es . Vielen Dank für die Hilfe.

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          712
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          6
                          11
                          430
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo