Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. httpGet funktioniert nach update node.js nicht mehr

    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

    httpGet funktioniert nach update node.js nicht mehr

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

      wie der Titel sagt: meine Scripte mit httpGet funktionieren nicht mehr. Ich bekomme die Fehlermeldung

      script.js.Skripte_aktiviert.Ansage_API_alle_(mit_Sonos_Api)_mit_Wohnzimmer_mit_HttpGet: socket hang up
      

      Hier das Script:

      // ##################################################################
      
      //                      Ansage
      
      // ##################################################################
      
      
      
      // ##################################################################
      //                      Definitionen
      // ##################################################################
      
      
      // Quellen
      var idWetter =           "hm-rega.0.29954";
      var idTemperatursensor = 'hm-rpc.0.OEQ1296052.1.TEMPERATURE'/*Außentemperatur:1 TEMPERATURE*/
      var idAnsageBuero = 'hm-rega.0.4529'/*AnsageAlexaBuero*/;
      var idAnsageSchlafzimmer = 'hm-rega.0.4528'/*AnsageAlexaSchlafzimmer*/;
      var idAnsageTerrasse = 'hm-rega.0.4626'/*AnsageAlexaTerrasse*/;
      var idAnsageKueche = 'hm-rega.0.4625'/*AnsageAlexaKüche*/;
      var idAnsageWohnzimmer = 'hm-rega.0.72055'/*AnsageAlexaWohnzimmer*/;
      
      
      
      // ##################################################################
      //                      Basiswerte ermitteln
      // ##################################################################
      
      
      function ermitteleAnsagedatum () {
          //Wochentag ermitteln
          var d = new Date ();
          var w = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
          var wochentag = w[d.getDay()]; 
      
          //Tagesdatum ermitteln
          var tag = d.getDate();
      
          //Monat ermitteln
          var month = new Array("Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember");
          var monat = month[d.getMonth()];
      
          //Jahr ermitteln
          var jahr = d.getFullYear();
      
          //Stunde ermitteln
          var stunde = d.getHours();
      
          //Minute ermitteln
          var minute = d.getMinutes();
      
          //Begrüssung ermitteln
          var Begr = " ";
          if(stunde<=12){Begr = "Guten Morgen"};
          if(stunde>=12 && stunde<=18){Begr = "Guten Tag"};
          if(stunde>18){Begr = "Guten Abend"};
          
          return { // zurückgeben
              'Jahr'      : jahr,
              'Monat'     : monat,
              'Tag'       : tag,
              'Wochentag' : wochentag,
              'Stunde'    : stunde,
              'Minute'    : minute,
              'Begr'      : Begr
          };
      }
      
      
      
      function ermitteleWetter () { // Wetterbedingungen
          var wetterdaten = getState(idWetter).val;
      //    log('Wetter: ' + wetterdaten);
          return(wetterdaten);
      }
      
      function ermitteleAnsageTemperatur () {
          // Die Außentemperatur ist xx. Das Wetter heute ist xx
          // Einfache Temperaturansage mit SayIt.
          // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht
          // "Es sind 18 Punkt 2 Grad " sagt.
      
          var temperatursensor = getState(idTemperatursensor).val;
          var temp_string = temperatursensor.toString();
      //    log('Temp  ' + temp_string);
          var temp_array = [];
          temp_array = temp_string.split(".");
      
          // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist.
          // Es wird dann nur "18" gelesen.
          if (!temp_array[1]) {
              temp_array[1] = "0";
      //        log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt.");
          }
          return{
              'Ganzzahl'      : temp_array[0],
              'Nachkommazahl' : temp_array[1]
          };
      }
      
      on([idAnsageBuero , idAnsageSchlafzimmer , idAnsageKueche , idAnsageTerrasse , idAnsageWohnzimmer], function(dp) {
         if(dp.state.val) {
      
          // ###########################################
          //                 ClearQueue
          // ###########################################
         
          // var APIQueueBuero = "http://192.168.0.105:5005/B%C3%BCro%20Ikea/clearqueue";
          // var APIQueueSchlafzimmer = "http://192.168.0.105:5005/Schlafzimmer/clearqueue";
         
          
      
      // ##################################################################
      //                          Basisansage
      // ##################################################################
      
          
          var ansagetext = ermitteleAnsagedatum().Begr + ", heute ist " + ermitteleAnsagedatum().Wochentag + " der " + ermitteleAnsagedatum().Tag + "te " + ermitteleAnsagedatum().Monat + ' ' + ermitteleAnsagedatum().Jahr 
                  + ". Es ist " + ermitteleAnsagedatum().Stunde + "  Uhr und " + ermitteleAnsagedatum().Minute + "  Minuten." 
                  + " Die Aussentemperatur beträgt " + ermitteleAnsageTemperatur().Ganzzahl + "," + ermitteleAnsageTemperatur().Nachkommazahl + " Grad." 
                  + " Wetter Bedingungen, " + ermitteleWetter() +" .";
                  
                  
      
      
      
      
      // ##################################################################
      //      Ansagetext zusammenstellen und in Objekt schreiben
      // ##################################################################
      
      // Info zum Verzeichnis     /home/brs/node-sonos-http-api-master/static/clips/;
      // Definitionen MP3;
      // herzlichWillkommen.mp3";
      // var herz = "herzlichWillkommen.mp3";
      // HundeGebell.mp3;
      // var hund = "HundeGebell.mp3";
      // Rolladen.mp3;
      // var roll = "Rolladen.mp3";
      
      // Definition APIsay Büro Ikea;
      var APIsayBuero = "http://192.168.0.105:5005/B%C3%BCro%20Ikea/say/";
      
      // Definition APIsay Schlafzimmer;
      var APIsaySchlafzimmer = "http://192.168.0.105:5005/Schlafzimmer/say/";
      
      // Definition APIsay Kueche;
      var APIsayKueche = "http://192.168.0.105:5005/K%C3%BCche/say/";
      
      // Definition APIsay Terrasse;
      var APIsayTerrasse = "http://192.168.0.105:5005/Terrasse/say/";
      
      // Definition APIsay Wohnzimmer;
      var APIsayWohnzimmer = "http://192.168.0.105:5005/Wohnzimmer/say/";
      
      var lautstaerke = 50;
      
      
      
      // Ansagetext
              // Basisansage
              var Ansage = ansagetext;
              
              //Geburtstagsansage
              var tempGEBURTSTAGE = "javascript.0.Ansage.GeburtstageHEUTE";
              var AnsageGEBURTSTAGE = getState(tempGEBURTSTAGE).val;
              
              //Muellsansage heute
              var tempMUELLheute = "javascript.0.Ansage.MuellHEUTE";
              var AnsageMUELLheute = getState(tempMUELLheute).val;
              
              //Muellsansage Zukunft
              var tempMUELLzukunft = "javascript.0.Ansage.MuellZUKUNFT";
              var AnsageMUELLzukunft = getState(tempMUELLzukunft).val;
      
      /*log("Tempansage--------------------->" + tempAnsage);
      log("Ansage--------------------->" + Ansage);
      
      log("tempGEBURTSTAGE--------------------->" + tempGEBURTSTAGE);
      log("AnsageGEBURTSTAGE--------------------->" + AnsageGEBURTSTAGE);
      
      log("tempMUELLheute--------------------->" + tempMUELLheute);
      log("AnsageMUELLheute--------------------->" + AnsageMUELLheute);
      
      log("tempMUELLzukunft--------------------->" + tempMUELLzukunft);
      log("AnsageMUELLzukunft--------------------->" + AnsageMUELLzukunft);*/
      
      
      
      // ####################################################
      // Wenn Geburtstag dann mit ansagen
      // ####################################################
      
          if (AnsageGEBURTSTAGE.length > 2) { // wenn der Inhalt des Objektes "AnsageGEBURTSTAGE" größer als 2 Zeichen lang ist, dann ...
              Ansage = Ansage + "Heute haben Geburtstag, " + AnsageGEBURTSTAGE +" .";
              //log("Ansage mit Geburtstag--------------------->" + Ansage);
          }
          
         
      // ####################################################
      // Wenn Müll dann mit ansagen
      // ####################################################
      
          if (AnsageMUELLheute.length > 2) { // wenn der Inhalt des Objektes "AnsageMUELLheute" größer als 2 Zeichen lang ist, dann ...
              Ansage = Ansage + "  Achtung, heute ist " + AnsageMUELLheute +" ." + "Bitte an die Strasse stellen" + " !";
              //log("Ansage mit Geburtstag und Muell heute--------------------->" + Ansage);
          }
          
      // ####################################################
      // Wenn Müll ZUKUNFT, dann mit ansagen
      // ####################################################
      
          if (AnsageMUELLzukunft.length > 2) { // wenn der Inhalt des Objektes "AnsageMUELLzukunft" größer als 2 Zeichen lang ist, dann ...
              Ansage = Ansage + "  Achtung, morgen ist " + AnsageMUELLzukunft + " ." + "Bitte MORGEN an die Strasse stellen" + " !";
              //log("Ansage mit Geburtstag und Muell heute und morgen--------------------->" + Ansage);
          }    
      
      
      
      // ####################################################
      //                  ANSAGE
      // ####################################################
         
         var idAnsageBueroWert = getState(idAnsageBuero).val;
         var idAnsageSchlafzimmerWert = getState(idAnsageSchlafzimmer).val;
         var idAnsageKuecheWert = getState(idAnsageKueche).val;
         var idAnsageTerrasseWert = getState(idAnsageTerrasse).val;
         var idAnsageWohnzimmerWert = getState(idAnsageWohnzimmer).val; 
      
         log("Buero: " + idAnsageBueroWert);
         log("Schlaf: " + idAnsageSchlafzimmerWert);
         log("Kueche: " + idAnsageKuecheWert);
         log("Terrasse: " + idAnsageTerrasseWert);
         log("Wohnzimmer: " + idAnsageWohnzimmerWert);
         
         if(idAnsageBueroWert) {
             
          Ansage = APIsayBuero + Ansage + "/" + lautstaerke;
            
          log("AnsageArbeitszimmer=" + Ansage);
          setState(idAnsageBuero,false);
       
          ansagenSonos(Ansage);//Funktion mit HttpGet in Global
          
          }
          // Ende If Büro
      
          if(idAnsageSchlafzimmerWert) {
             
          Ansage = APIsaySchlafzimmer + Ansage + "/" + lautstaerke;
          
          log("AnsageSchlafzimmer=" + Ansage);
          setState(idAnsageSchlafzimmer,false);
      
          ansagenSonos(Ansage);//Funktion mit HttpGet in Global
          }
          // Ende If Schlafzimmer
      
      
           if(idAnsageKuecheWert) {
             
          Ansage = APIsayKueche + Ansage + "/" + lautstaerke;
          
          log("AnsageKuecher=" + Ansage);
          setState(idAnsageKueche,false);
      
          ansagenSonos(Ansage);//Funktion mit HttpGet in Global
          }
          // Ende If Kueche
      
      
          if(idAnsageTerrasseWert) {
             
          Ansage = APIsayTerrasse + Ansage + "/" + lautstaerke;
          
          log("AnsageTerrasse=" + Ansage);
          setState(idAnsageTerrasse,false);
      
          ansagenSonos(Ansage);//Funktion mit HttpGet in Global
          }
          // Ende If Terrasse
      
          
          if(idAnsageWohnzimmerWert) {
      
          Ansage = APIsayWohnzimmer + Ansage + "/" + lautstaerke;
          
          log("AnsageWohnzimmer=" + Ansage);
          setState(idAnsageWohnzimmer, false);
      
          // Definition Zustaende Denon
          const idDenonPower = 'denon.0.zoneMain.powerZone'/*Main Zone Power State*/;
          const idDenonInput = 'denon.0.zoneMain.selectInput'/*Select input*/;
          // const idDenonVolume = 'denon.0.zoneMain.volume'/*Main Volume*/;
          // var alterWertVolume = getState(idDenonVolume).val;
      
          // Check if the Denon adapter is off 
      
          if (!getState(idDenonPower).val) { 
          // Turn on the Denon adapter 
          setState(idDenonPower, true);
           log("idDenonPower=" + "true");
      
      
          // Set the input to CD
          setStateDelayed(idDenonInput, "CD", 2000);
              log("idDenonInput=" + "CD");
              // setState(idDenonVolume, 50 );
          // Play the announcement delayed by 10 seconds using the Sonos API
          setTimeout(function() {
              log("Ansage wird gespielt");
          
          ansagenSonos(Ansage);//Funktion mit HttpGet in Global
          }, 6000);
      
          // Set the input back to TV
          setTimeout(function() {
          setStateDelayed(idDenonInput, "TV", 2000);
          log("idDenonInput auf TV zurueck");
          // Volume zurücksetzen
          // setState(idDenonVolume, alterWertVolume);
          // Turn off the Denon adapter
          setStateDelayed(idDenonPower, false, 4000);
          log("idDenonPower aus");
          }, 30000);
      
          }; // Ende If ist AN Z.302
         
          } // Ende If Wohnzimmer Z. 289
      
          
       } // Ende If aus on Ansage Z. 100
       
      }); // Ende ON Zeile 98
      

      ...und hier das zugehörige globale Script

      function ansagenSonos(url) {
          httpGet(url, {timeout: 30000}, (error) => {
              if(error) {
                  console.error(error);
              }        
          });
      }
      

      Bis zum update auf Node.js: v20.18.0 haben die Sripte perfekt funktioniert. Da mein Linux unter VirtualBox von Oracle läuft, konnte ich diesen Zusammenhang reproduzieren. indem ich auf einen früheren Snapshot mit der 18er Version zurückgegangen bin. Da läuft alles sauber.

      Hat jemand einen Tip für mich?

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

        @skorpil schau mal nach, in welchem zeitlichen Rahmen da Aktionen laufen. Sprich wie oft Daten via httpget abgerufen werden. Wenn zu oft, dann "blockieren" manchmal die aufzurufenden. Dann wäre die Meldung logisch.

        Ro75

        S 1 Reply Last reply Reply Quote 1
        • S
          skorpil @Ro75 last edited by

          @ro75 danke, ich checke das

          1 Reply Last reply Reply Quote 0
          • S
            skorpil last edited by skorpil

            Zur Info: es scheint kein Problem von httpGet zu sein, wie ich zunächst vermutete, sondern ein Problem der node-sonos-http-api in Verbindung mit Node.js 20. Der Entwickler schrieb mir dazu auf GitHub:

            I think this is related to this global change in Node 20:

            nodejs/node#43522

            The Sonos players probably doesn't like keep-alive, and might not properly respond with a Connection: close. The http api will maintain connections and try to send new requests over the old socket and probably confusing the player.

            Since this only affects requests that happen within 30-90 seconds (not sure what the default timeout is), this might appear random.

            I'll see if I can reproduce it, I haven't run this project under newer Node.js versions in a long time.

            Hat jemand ähnliche Probleme mit der node-sonos-http-api?

            ShogunPanda created this issue in nodejs/node

            closed Use Keep-Alive by default in global agents and close idle connections in server #43522

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

            Support us

            ioBroker
            Community Adapters
            Donate

            972
            Online

            31.8k
            Users

            80.0k
            Topics

            1.3m
            Posts

            2
            4
            260
            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