@labersack Rückschein ist per email raus an Dich. 1000 Dank noch mal!
NEWS
Best posts made by skorpil
-
RE: Angebot für Reparatur des "C26-Problems"
-
RE: [Vorlage] Anwesenheitssimulation - Script
@tontechniker nicht wirklich! Aber versuche mal
var zeit2von = "00:00:00"; //Aktivzeit von IDGruppe2 var zeit2bis = "00:00:01"; //Aktivzeit bis IDGruppe2 var zeit3von = "00:00:00"; //Aktivzeit von IDGruppe3 var zeit3bis = "00:00:01"; //Aktivzeit bis IDGruppe3 var zeit4von = "00:00:00"; //Aktivzeit von IDGruppe4 var zeit4bis = "00:00:01"; //Aktivzeit bis IDGruppe4 var zeit5von = "00:00:00"; //Aktivzeit von IDGruppe5 var zeit5bis = "00:00:01"; //Aktivzeit bis IDGruppe5
bei den Zeiten 2 bis 4 die „bis Zeit“ komplett auf Null zu setzen, also „00:00:00“. Vielleicht ist die Zeitdifferenz zu klein. Ich habe da bei mir in allen 5 Gruppen von „sunset“ und bis „sunrise“ drinstehen. Und habe da keine Fehlermeldung.
-
RE: [gelöst] Elegantere Programmierung?
ich brauche bitte nochmal eine Erklärung, weil ich offenbar die ON Funktion noch nicht richtig verstanden habe resp. werde ich aus der Beschreibung "ioBroker/ioBroker.javascript" nicht wirklich schlau. Genauer gefragt, welche Rolle spielt in der ON Funktion der Teil "function" ?
on({id: IDAnwesend, val: false} , function (data) {
Hier kommt hinter function "data". Und hier:
on({id: IDAnwesend, change: 'ne'}, function () {
ist der Klammerausdruck leer. Was ist der Unterschied? Wann muß da data rein und wann kann die Klammer leer bleiben.
-
RE: Angebot für Reparatur des "C26-Problems"
@labersack Dankeschön noch einmal, der Adapter ist wieder gut zu Hause.
-
RE: [Vorlage] Anwesenheitssimulation - Script
@tontechniker aha, dann war meine cron Vermutung richtig…
-
RE: [gelöst] Elegantere Programmierung?
Wunschgemäß zeige ich hier jetzt mal meine Scripte, die ich mit Eurer Hilfe erstellt habe. Sie dienen dazu, Wetterdaten, Uhrzeit und Wochentag, Geburtstage mit Alter sowie die Abholtermine für den Müll in Sonos oder Alexa anzusagen. Es sind insgesamt 5 Scripte. Sicher sind die alle nicht optimal programmiert. Die Füchse unter Euch können das sicher effizienter und eleganter. Aber: sie funktionieren! Benötigt werden ein Kalender mit Geburtstagen und Abholterminen für den Müll, der ical sowie die Alexa, Broadlink und iot- adapter sowie die Sonos API.
Script 1 ermittelt aus dem Kalender Geburtstage und Alter und legt die Texte in einem Datenpunkt ab, auf den später andere Scripte zugreifen können. Die Scripte, die der "Ermittlung" dienen werden nur einmal täglich nachts ausgeführt:
Script 2 ermittelt den Abholtermin des Mülls für den heutigen Tag:
Script 3 ermittelt den Abholtermin für den nächsten Tag:
Script 4 dient der ANSAGE der Ereignisse über SONOS, abhängig von einem Bewegungsmelder in einem definierten Raum, und spielt danach auf der Sonos Anlage einen definierten Radiosender für eine definierte Zeit ab:
Script 5 macht das Gleiche wie Script 4, nur reagiert es auf einen definierten Alexa Sprachbefehl (wobei bei einem Sonos Gerät vorher noch der Verstärker eingeschaltet wird):
Script 6 dient der Ansage über ein bestimmtes Alexagerät (hier: im Badezimmer):
Viel Spaß beim Anpassen und verwenden. Für Rückfragen stehe ich jederzeit gerne zur Verfügung.
-
RE: Angebot für Reparatur des "C26-Problems"
@labersack 1000 Dank noch mal. Der aktuell ist wieder hier angekommen. Ich frage mich wirklich, was EQ3 da im Sinn hatte, diese nicht haltbaren Kondensatoren zu verbauen!
Latest posts made by skorpil
-
RE: node-sonos-http-api
@oliverio derjenige, der das Nachdenken angestoßen hat, bin ich
-
node-sonos-http-api
Da die Verwendung dieser API ja hier beim Sonos Adapter offiziell empfohlen wird: ich habe herausgefunden, dass diese API unter Node.js. 20 nicht mehr sauber funktioniert. Zunächst habe ich das auf den Befehl httpGet geschoben und vermutete hier das Problem. Nach vielen Tests konnte ich das Problem eingrenzen. Hier die Antwort des Entwickler der AP:
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.
Hier noch der Link zu meinem anderen Post.
Hat jemand ähnliche Probleme wie ich?
-
RE: httpGet funktioniert nach update node.js nicht mehr
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?
-
RE: httpGet funktioniert nach update node.js nicht mehr
@ro75 danke, ich checke das
-
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?
-
RE: backitup Speicherort
@codierknecht sagte in backitup Speicherort:
@skorpil
Ohne zunächst mal auf das eigentliche Problem einzugehen:
Macht der Mini-PC außer ioBroker (und damit verbundenen Diensten) noch was anderes?
Wenn nicht: Tu Dir den Gefallen und lass den ganzen Salat unter Linux (Debian) laufen.
Ich bin in Sachen Linux auch nur ein Rookie, aber ein ioBroker läuft unter Linux einfach deutlich stabiler, sparsamer und schneller.Nun zu Deinem eigentlichen Problem:
- Lege in der Fritte einen eigenen User für den Zugriff durch ioBroker an. Ohne Sonderzeichen und Großbuchstaben. Das gilt auch für das Kennwort.
- Der neue Benutzer muss Zugriff auf die NAS-Inhalte erhalten
- Die Einstellungen in der Instanz sehen dann so aus:
Feedback: das hat funktioniert! Vielen Dank!
-
RE: backitup Speicherort
@thomas-braun Danke für die mitternächtliche Antwort. Ich melde mich morgen und berichte….vielen Dank!
-
RE: backitup Speicherort
Meinen äußert limitierten Linux Kenntnissen ist es geschuldet, dass ich jetzt genauso schlau bin, wie zuvor. Welches ist denn jetzt meine Festplatte E oder das Fritznas. Was muss ich tun, um die zu finden? Oder, und das ist meine Vermutung: muss ich in Virtualbox etwas unternehmen, um die Platten dann unter Linux „sichtbar“ zu machen!