NEWS
httpGet funktioniert nach update node.js nicht mehr
-
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?
-
@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
-
@ro75 danke, ich checke das
-
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?