@mrdaniel danke. Ich werde es überleben, wenn auch nur knapp. Außerdem ist die Lernkurve gerade dramatisch angestiegen bei mir für das nächste Jahr.
NEWS
Best posts made by skorpil
-
RE: Diskussion zu Cloud/Vis-Offline-Weihnachtsangebot 2024
-
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: ra_configure ?????? [Fehler im ADMIN?]
@djmarc75 Ich hab's nach bestem Wissen und Gewissen bei Github gemeldet. Vermutlich werde ich dort auch, wie hier von Dir, gesteinigt, weil ich in Software Englisch nicht ordentlich formulieren kann. Aber sei es drum.
-
RE: [Vorlage] Anwesenheitssimulation - Script
@tontechniker aha, dann war meine cron Vermutung richtig…
-
RE: ra_configure ?????? [Fehler im ADMIN?]
@djmarc75 gibt es nicht. Das ist ein Videokurs
-
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: Überreste alter JavaScripte
@tt-tom mit meinem Standart User.
-
ich habe schon mit mir selber darüber diskutiert, wo der Fehler liegen könnte. Ich hatte erst ein Verzeichnis unter ioBroker-data angelegt. Dann erst bemerkt, dass der Adapter das nicht mag und dann habe ich ein neues angelegt, mit allen Rechten. Nachdem dann alle Scripte weg waren, habe ich die Sicherung zurückgespielt. Und dann waren ein Teil der Scripte wieder da, und zwar im Adapter als auch im Spiegel. Leider aber eben nicht alle Skripte, so dass ich dann den Weg über Virtualbox gegangen bin.
-
ich habe mich auch schon gefragt, warum nicht alle Skripte importiert worden bzw. vorher exportiert wurden. Ich glaube, der Adapter mag bestimmte Sonderzeichen bei der Benamung der Scripte nicht.
-
Latest posts made by skorpil
-
RE: Diskussion zu Cloud/Vis-Offline-Weihnachtsangebot 2024
@mrdaniel danke. Ich werde es überleben, wenn auch nur knapp. Außerdem ist die Lernkurve gerade dramatisch angestiegen bei mir für das nächste Jahr.
-
RE: Diskussion zu Cloud/Vis-Offline-Weihnachtsangebot 2024
@mrdaniel @Gaspode danke für den Hinweis. Da war ich meiner Zeit, wie immer, mal wieder weit voraus. Das ist aber okay.
-
RE: Diskussion zu Cloud/Vis-Offline-Weihnachtsangebot 2024
@apollon77 danke euch erneut für das tolle Angebot. Ich habe gerade auch schon das Abo für das Jahr 2026 bestellt. Allerdings hat er offenbar die Weihnachtsrabattierung bei mir nicht angenommen. Das ist aber auch kein Problem. Betrachtet die Differenzsumme als kleine Spende von mir.
-
RE: node-sonos-http-api
@oliverio guter Hinweis! Ich habe keine Ahnung. Der Entwickler der APi, Jishi, schrieb bei GitHub, er wolle sich kümmern. Mal sehen…
Die Frage ist, ob es evtl. hier Profis gibt, die das fixen können. Denn der Code ist ja frei zugänglich!
-
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!