Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [Gelöst] Änderung von Statusberichten

    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

    [Gelöst] Änderung von Statusberichten

    This topic has been deleted. Only users with topic management privileges can see it.
    • paul53
      paul53 @DocGame last edited by paul53

      @DocGame sagte:

      Leider bin ich in JS nicht weit genug drin

      const sensors = $('channel[state.id=mihome.0.devices.*.percent]');
      
      function lowBatt() {
         var Infos = [];       
         var InfoMessage = 'Batterien zu tauschen:\n';
         sensors.each(function(id, i) {
            if(getState(id).val < 30) {
               var pathname = id.substring(0, id.indexOf(".percent"));
               var wholeName = getObject(pathname).common.name;
               var name = wholeName.substring(wholeName.indexOf("- ") + 1, wholeName.length); 
               Infos.push(name);
            }
         });
         if(Infos.length) {
            for(let i = 0; i < Infos.length; i++) {
               InfoMessage = InfoMessage + Infos[i] + '\n';
            }  
            sendTo("telegram", "send", {user: 'Ralf', text: InfoMessage});
         }
      }
      
      schedule('0 20 * * *', lowBatt); 
      

      EDIT: Zeile 4 korrigiert: Info --> Infos

      1 Reply Last reply Reply Quote 0
      • D
        DocGame last edited by

        Danke erstmal,
        ich habe den Wert mal auf <99 geändert, da ich ja eine Liste aller Sensoren will.
        Fehler zeigt er keine an. Ich warte mal gespannt bis 20.00Uhr.
        Wenn das funktioniert wäre mein nächstes Nahziel nicht die Zeitgesteuerte Erstellung sondern bei Ausführung.

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

          @DocGame sagte:

          nicht die Zeitgesteuerte Erstellung sondern bei Ausführung

          on({id: /^mihome\.0\.devices\..+\.percent$/, valLt: 30, oldValGe: 30}, lowBatt);
          
          1 Reply Last reply Reply Quote 0
          • D
            DocGame last edited by

            Hab mich schon gefreut, dass um 20.00 Uhr Telegram angesprungen ist. War aber nur das Script vom ersten Post (Wird auch um 20.00 Uhr verschickt).
            Unter deinem Script kommt im Status unten nur:
            19:11:29.266 info javascript.0 Start javascript script.js.Bot-Scripts.BatterieListe_Telegram
            19:11:29.266 info javascript.0 script.js.Bot-Scripts.BatterieListe_Telegram: registered 0 subscriptions and 1 schedule
            20:00:00.041 error javascript.0 at script.js.Bot-Scripts.BatterieListe_Telegram:23:10
            20:00:00.041 error javascript.0 at Object.<anonymous> (script.js.Bot-Scripts.BatterieListe_Telegram:13:12)

            Mit der einzelnen Scriptzeile kann ich leider nichts anfangen, da ich gar nicht weiss wo ich sie rein kopieren soll.
            Mit Blockly komme ich ja einigermassen klar aber JS ist mir leider noch zu fremd, bei meinen Wünschen hier aber sicherlich die erste Wahl..

            Ich befürchte, das ich so leider nicht zum Ziel komme.
            Danke für deine Programmzeilen. Da fehlt wohl doch noch einiges bei meinem Verständniss.

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

              @DocGame sagte:

              20:00:00.041 error javascript.0 at script.js.Bot-Scripts.BatterieListe_Telegram:23:10
              20:00:00.041 error javascript.0 at Object.<anonymous> (script.js.Bot-Scripts.BatterieListe_Telegram:13:12)

              Damit kann ich auch nichts anfangen, denn Zeilen 13 und 23 in meinem Skript können keine Fehlermeldungen erzeugen. Zeile 4 enthält einen Fehler (habe ich oben korrigiert): Ändere bitte Info in Infos.

              @DocGame sagte in Änderung von Statusberichten:

              Mit der einzelnen Scriptzeile kann ich leider nichts anfangen, da ich gar nicht weiss wo ich sie rein kopieren soll.

              Sie ersetzt die letzte Zeile (22) anstelle von schedule().

              D 1 Reply Last reply Reply Quote 0
              • D
                DocGame @paul53 last edited by DocGame

                @paul53
                Hier der Code:

                const sensors = $('channel[state.id=mihome.0.devices.*.percent]');
                
                 function lowBatt() {
                   var Info = [];       
                   var InfoMessage = 'Batterien zu tauschen:\n';
                   sensors.each(function(id, i) {
                      if(getState(id).val < 99) {
                         var pathname = id.substring(0, id.indexOf(".percent"));
                         var wholeName = getObject(pathname).common.name;
                         var name = wholeName.substring(wholeName.indexOf("- ") + 1, wholeName.length); 
                         Infos.push(name);
                      }
                   });
                   if(Infos.length) {
                      for(let i = 0; i < Infos.length; i++) {
                         InfoMessage = InfoMessage + Infos[i] + '\n';
                      }  
                      sendTo("telegram", "send", {user: 'Ralf', text: InfoMessage});
                   }
                }
                
                schedule('32 22 * * *', lowBatt); 
                

                und hier die Fehlermeldung:

                22:30:04.357 info javascript.0 Start javascript script.js.Bot-Scripts.BatterieListe_Telegram
                22:30:04.358 info javascript.0 script.js.Bot-Scripts.BatterieListe_Telegram: registered 0 subscriptions and 1 schedule
                22:32:00.036 error javascript.0 at script.js.Bot-Scripts.BatterieListe_Telegram:11:10
                22:32:00.036 error javascript.0 at Object.lowBatt (script.js.Bot-Scripts.BatterieListe_Telegram:6:12)

                Beim ersetzen der Zeile 22 durch

                on({id: /^mihome\.0\.devices\..+\.percent$/, valLt: 30, oldValGe: 30}, lowBatt); 
                

                tut sich beim Ausführen des Scripts leider gar nichts. Ich stehe etwas auf dem Schlauch..

                Werde jetzt aber mal ins Bett gehen (der Wecker droht 😃 )

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

                  @DocGame sagte:

                  Hier der Code:

                  Enthält noch den Fehler in Zeile 4 (siehe vorheriger Post). Bitte ändern in

                     var Infos = [];
                  

                  @DocGame sagte in Änderung von Statusberichten:

                  tut sich beim Ausführen des Scripts leider gar nichts.

                  Damit tut sich auch nur was, wenn sich ein Batterie-Wert von >= 30 % auf < 30 % ändert. Um die Funktion lowBatt() bei Skriptstart zu testen, rufe die Funktion bei Skriptstart auf:

                  on({id: /^mihome\.0\.devices\..+\.percent$/, valLt: 30, oldValGe: 30}, lowBatt); // Triggert bei Erreichen des Grenzwertes
                  lowBatt(); // Aufruf bei Skriptstart für Test
                  
                  D 1 Reply Last reply Reply Quote 0
                  • D
                    DocGame @paul53 last edited by

                    @paul53
                    Mit den Änderungen hat es jetzt geklappt. wenn ich oben 99 reinschreibe kommen alle Sensoren wie gewünscht. Ich habe etwas gebastelt, bekomme aber die Prozentzahl nicht rein. Es soll ja nur eine Übersichtsliste generiert werden mit allen Sensoren und den aktuellen Batteriewerten. Das pushen bei unterschreiten wäre nur ein "Nice to have", da mein altes Script ja läuft und in diesem Fall einspringen würde. Wenn man diesen Part rausnehmen würde wäre das ganze ja deutlich schlanker. Irgendwie bin ich mit meinen %-Werten allerdings auf dem Holzweg. Hier einmal der geänderte Code(Zeile 16):

                    const sensors = $('channel[state.id=mihome.0.devices.*.percent]');
                    
                     function lowBatt() {
                       var Infos = [];       
                       var InfoMessage = 'Batterien zu tauschen:\n';
                       sensors.each(function(id, i) {
                          if(getState(id).val < 80) {
                             var pathname = id.substring(0, id.indexOf(".percent"));
                             var wholeName = getObject(pathname).common.name;
                             var name = wholeName.substring(wholeName.indexOf("- ") + 1, wholeName.length); 
                             Infos.push(name);
                          }
                       });
                       if(Infos.length) {
                          for(let i = 0; i < Infos.length; i++) {
                             InfoMessage = InfoMessage + Infos[i] + value + '% \n';
                          }  
                          sendTo("telegram", "send", {user: 'Ralf', text: InfoMessage});
                       }
                    }
                    
                    on({id: /^mihome\.0\.devices\..+\.percent$/, valLt: 30, oldValGe: 30}, lowBatt); // Triggert bei Erreichen des Grenzwertes
                    lowBatt(); // Aufruf bei Skriptstart für Test
                    
                    paul53 1 Reply Last reply Reply Quote 0
                    • paul53
                      paul53 @DocGame last edited by

                      @DocGame sagte:

                      bin ich mit meinen %-Werten allerdings auf dem Holzweg. Hier einmal der geänderte Code(Zeile 16):

                      Ja, an der Stelle ist es zu spät. Ausserdem ist die Variable value nicht deklariert und gefüllt. Ersetze Zeile 7 durch:

                            var value = getState(id).val;
                            if(value < 30) {
                      

                      und ergänze Infos.push()

                               Infos.push(name + ': ' + value + ' %');
                      
                      D 1 Reply Last reply Reply Quote 0
                      • D
                        DocGame @paul53 last edited by DocGame

                        @paul53
                        Perfekt...Funktioniert Prima. Vielen Dank
                        Ich denke, das ich das ganze auch auf Temperatur ändern kann.
                        Nur mir den Fenstern (Boolsche Werte) wird es so vermutlich nicht hinhauen.

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

                          @DocGame sagte:

                          Funktioniert Prima.

                          Dann markiere bitte das Thema in der Überschrift als [gelöst].

                          Ich denke, das ich das ganze auch auf Temperatur ändern kann.

                          Ja, sicher.

                          @DocGame sagte in Änderung von Statusberichten:

                          Nur mir den Fenstern (Boolsche Werte) wird es so vermutlich nicht hinhauen.

                          Es unterscheidet sich nur in der Abfrage:

                                if(value) { // Fenster offen
                          

                          (push() natürlich ohne %) und im Trigger.

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

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          465
                          Online

                          31.9k
                          Users

                          80.1k
                          Topics

                          1.3m
                          Posts

                          2
                          14
                          503
                          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