NEWS
Portierung CCU.IO
-
Hallo,
das ist ja verzwickt. Hier noch ein paar Versuche:
` > ````
javascript-0 2015-11-14 17:51:56 info script.js.Statusaenderungen_sagen: Saying: Das Fenster im Bad ist schon lenger als eine halbe Stunde offen. Bitte endlich mal zu machen.
```` `
Der Text hat schon sehr viele Zeichen. Ich habe mit solch langen Texten immer wieder Probleme.Das Log meldet ein Problem mit der Variable 'text'. Umgehe das doch nochmal und lasse die Erinnerungsfunktion 'saySomething' erstmal weg.
Alternativ oder vielleicht probierst du zuerst:
saySomething erwartet (idGeraet, text, repeat) - ich weiß nicht, ob repeat optional ist oder doch jedesmal mit übergeben werden muss. Kann es sein, dass der Adapter das 'true' oder 'false' aus repeat evtl. in der Funktion in 'text' schreiben will, wenn du nur zwei der drei Parameter übergibst? Ausserdem ist es unglücklich, 'repeat' oben für das ganze Skript zu deklarieren und in saySomething nochmal. Und eine Variable 'repeat' reicht doch, da boolean. Da brauchst du no-repeat nicht mehr.
Besser so:
var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser var idWaschmaschine = 'hm-rega.0.39968'; //STAT_Waschmaschine_fertig var idTrockner = 'hm-rega.0.44879'; //STAT_W.Trockner_fertig var idBad_daueroffen = 'hm-rega.0.37449'; //Badezimmer_Alarm_daueroffen. Werte: zu; daueroffen; zu lang offen var timer = {}; var debug = true; var repeat = false; // bei Skriptstart ausschalten // Eigentlich reicht ein subscribe, in dem alle 3 Zustände abgefragt werden, aber zum Test mal so: on ({id: idBad_daueroffen, val: 'zu'}, function (data) { repeat = false; }); on ({id: idBad_daueroffen, val: 'daueroffen'}, function (data) { repeat = false; // Einmalige Ansage //sayOpen(idBad_daueroffen, "Achtung Systemmeldung um " +d.getHours() + " Uhr und " + d.getMinutes() + " Minuten:", 1000, repeat); saySomething(idBad_daueroffen, 'Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen', repeat); }); on ({id: idBad_daueroffen, val: 'zu lang offen'}, function (data) { repeat = true; // Ansage wiederholen //sayOpen(idBad_daueroffen, "Achtung Systemmeldung um " +d.getHours() + " Uhr und " + d.getMinutes() + " Minuten:", 1000; repeat); saySomething(idBad_daueroffen, 'Das Fenster im Bad ist schon lenger als eine halbe Stunde offen. Bitte endlich mal zu machen.', repeat); }); //----------------------------------------- Waschmaschine und Trockner -------------------------------- on ({id: idWaschmaschine, val: 'fertig'}, function (data) { saySomething(idWaschmaschine, 'Die Waschmaschine ist fertig', false); // nicht wiederholen }); on ({id: idTrockner, val: 'fertig'}, function (data) { saySomething(idTrockner, 'Der Trockner ist fertig', false); // nicht wiederholen }); function saySomething(idGeraet, text, wiederholung) { // Sage zum ersten Mal var d = new Date (); var h = d.getHours(); if (debug || (h < 22) && (h > 9)) // nur zwischen 9 und 20 Uhr { log('Saying: ' + text); setState(idSprache, text); if (wiedeholung) { // Sag jede 10 Min Text an timer[idGeraet] = setInterval(function() { log('Timer[' + idGeraet + ']=' + timer[idGeraet]); log('Get State=' + getState(idGeraet).val); if (getState(idGeraet).val == 2) { log('Saying again: ' + text); setState(idSprache, text); } else { if (timer[idGeraet]) clearInterval(timer[idGeraet]); timer[idGeraet] = null; } }, 600000); } } }
Gruß
Pix
-
Hallo Pix
Danke, dass Du Dich meiner annimmst.
Dein Code zeigt aber den gleichen Effekt:
Alle Sayings funktionieren. Nur das eine nicht:
sayit.0 2015-11-15 21:15:02 info sayit.0 Upload announce mp3 files sayit.0 2015-11-15 21:15:02 info sayit.0 starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit bananapi 2015-11-15 21:14:58 info host.bananapi instance system.adapter.sayit.0 started with pid 4849 bananapi 2015-11-15 21:14:28 info host.bananapi Restart adapter system.adapter.sayit.0 because enabled bananapi 2015-11-15 21:14:28 error host.bananapi instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) sayit.0 2015-11-15 21:14:27 error Error: socket hang up at createHangUpError (_http_client.js:215:15) at TLSSocket.socketCloseListener (_http_client.js:247:23) at TLSSocket.emit (events.js:129:20) at TCP.close (net.js: sayit.0 2015-11-15 21:14:27 error uncaught exception: socket hang up sayit.0 2015-11-15 21:14:27 error Error: connect EHOSTUNREACH at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) sayit.0 2015-11-15 21:14:27 error uncaught exception: connect EHOSTUNREACH sayit-0 2015-11-15 21:14:24 info saying: Das Fenster im Bad ist schon lenger als eine halbe Stunde offen. hm-rega-0 2015-11-15 21:14:24 info Got unexpected ID: hm-rega.0.37449 javascript-0 2015-11-15 21:14:24 info script.js.Test2: Saying: Das Fenster im Bad ist schon lenger als eine halbe Stunde offen. sayit-0 2015-11-15 21:14:13 info saying: Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen javascript-0 2015-11-15 21:14:13 info script.js.Test2: Saying: Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen hm-rega-0 2015-11-15 21:14:13 info Got unexpected ID: hm-rega.0.37449 sayit-0 2015-11-15 21:13:59 info saying: Der Trockner ist fertig hm-rega-0 2015-11-15 21:13:59 info Got unexpected ID: hm-rega.0.44879 javascript-0 2015-11-15 21:13:59 info script.js.Test2: Saying: Der Trockner ist fertig sayit-0 2015-11-15 21:13:51 info saying: Die Waschmaschine ist fertig javascript-0 2015-11-15 21:13:51 info script.js.Test2: Saying: Die Waschmaschine ist fertig
Gruss Ralf
-
Für mich liegt der Fehler im TTS-Adapter, nicht im Javascript.
Das sind meine Einstellungen. EinsUnterschied zu Deinen aus diesem Beitrag (http://forum.iobroker.net/download/file … &mode=view) ist die Einstellung bei Typ.
Gruß
Pix
-
Hallo Pix
Bei mir sieht's anders aus: Typ ist "System" weil ja der Banana-Pi über die an ihm angeschlossenen Aktivboxen reden soll.
Systemkommando ist leer und bei Ankündigung steht "keins"
Und jetzt kommt der Hammer: Ich habe heute gefühlt ca. 1000 mal den Banana-Pi rebootet, weil er einfach kein Default-Gateway für's WLAN hatte. Manuell konnte man auf der Konsole mit
sudo route add default gw 192.168.1.1 wlan0
eines hinzufügen, aber nach dem Booten musste man diesen Befehl immer wieder von Hand eingeben. Ich habe zig Versuche mit````
up route add default gw 192.168.1.1 dev wlan0Wie auch immer: Nachdem ich hier Erfolg verbuchen konnte, wollte ich nochmal Pix's Script untersuchen und testen. Und was soll ich sagen: Auf einmal funktioniert alles. Hä? Warum?? Wer soll das denn blicken? Hier nochmal der Code der geht:
var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser
var idWaschmaschine = 'hm-rega.0.39968'; //STAT_Waschmaschine_fertig
var idTrockner = 'hm-rega.0.44879'; //STAT_W.Trockner_fertig
var idBad_daueroffen = 'hm-rega.0.37449'; //Badezimmer_Alarm_daueroffen. Werte: zu; daueroffen; zu lang offenvar timer = {};
var debug = true;
var repeat = false; // bei Skriptstart ausschalten// Eigentlich reicht ein subscribe, in dem alle 3 Zustände abgefragt werden, aber zum Test mal so:
on ({id: idBad_daueroffen, val: 'zu'}, function (data) {
repeat = false;
});on ({id: idBad_daueroffen, val: 'daueroffen'}, function (data) {
repeat = false; // Einmalige Ansage
//sayOpen(idBad_daueroffen, "Achtung Systemmeldung um " +d.getHours() + " Uhr und " + d.getMinutes() + " Minuten:", 1000, repeat);
saySomething(idBad_daueroffen, 'Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen', repeat);
});on ({id: idBad_daueroffen, val: 'zu lang offen'}, function (data) {
repeat = true; // Ansage wiederholen
//sayOpen(idBad_daueroffen, "Achtung Systemmeldung um " +d.getHours() + " Uhr und " + d.getMinutes() + " Minuten:", 1000; repeat);
saySomething(idBad_daueroffen, 'Das Fenster im Bad ist schon lenger als eine halbe Stunde offen.', repeat);
});//----------------------------------------- Waschmaschine und Trockner --------------------------------
on ({id: idWaschmaschine, val: 'fertig'}, function (data) {
saySomething(idWaschmaschine, 'Die Waschmaschine ist fertig', false); // nicht wiederholen
});on ({id: idTrockner, val: 'fertig'}, function (data) {
saySomething(idTrockner, 'Der Trockner ist fertig', false); // nicht wiederholen
});function saySomething(idGeraet, text, wiederholung)
{
// Sage zum ersten Mal
var d = new Date ();
var h = d.getHours();if (debug || (h < 22) && (h > 9)) // nur zwischen 9 und 20 Uhr
{
log('Saying: ' + text);
setState(idSprache, text);if (wiederholung) { // Sag jede 10 Min Text an timer[idGeraet] = setInterval(function() { log('Timer[' + idGeraet + ']=' + timer[idGeraet]); log('Get State=' + getState(idGeraet).val); if (getState(idGeraet).val == 2) { log('Saying again: ' + text); setState(idSprache, text); } else { if (timer[idGeraet]) clearInterval(timer[idGeraet]); timer[idGeraet] = null; } }, 600000); }
}
}
Ich bin mal gespannt wie lange. Jetzt teste ich mal ob es wirklich an der Länge des Textes liegt. Werde berichten. Gruss Ralf
-
… tatsächlich. Habe jetzt den Satz verlängert auf "Achtung. Das Badezimmerfenster ist schon lenger als eine halbe Stunde offen. Bitte zu machen"
Und schon knallts wieder:
host-bananapi 2015-11-16 23:10:05 info Restart adapter system.adapter.sayit.0 because enabled host-bananapi 2015-11-16 23:10:05 error instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) TypeError: 2015-11-16 23:10:05 error at FSReqWrap.oncomplete (fs.js:95:15) TypeError: 2015-11-16 23:10:05 error at /opt/iobroker/node_modules/iobroker.sayit/main.js:276:21 TypeError: 2015-11-16 23:10:05 error at getLength (/opt/iobroker/node_modules/iobroker.sayit/main.js:164:27) TypeError: 2015-11-16 23:10:05 error at /opt/iobroker/node_modules/iobroker.sayit/main.js:277:39 TypeError: 2015-11-16 23:10:05 error at /opt/iobroker/node_modules/iobroker.sayit/main.js:415:21 TypeError: 2015-11-16 23:10:05 error at cacheFile (/opt/iobroker/node_modules/iobroker.sayit/main.js:397:5) TypeError: 2015-11-16 23:10:05 error at sayItSystem (/opt/iobroker/node_modules/iobroker.sayit/main.js:672:9) TypeError: 2015-11-16 23:10:05 error at sayFinished (/opt/iobroker/node_modules/iobroker.sayit/main.js:203:45) TypeError: 2015-11-16 23:10:05 error Cannot read property 'text' of undefined uncaught 2015-11-16 23:10:05 error exception: Cannot read property 'text' of undefined sayit-0 2015-11-16 23:10:05 warn Received file is too short: sayit-0 2015-11-16 23:10:05 warn Cannot read length of file /opt/iobroker/node_modules/iobroker.sayit/say.mp3 sayit-0 2015-11-16 23:10:05 warn Received file is too short: sayit-0 2015-11-16 23:10:04 info saying: Achtung. Das Badezimmerfenster ist schon lenger als eine halbe Stunde offen. Bitte zu machen
Gruss Ralf
-
Hallo Pix, Bluefox
Ich habe, nachdem jetzt das Script läuft (mit kurzen Sätzen) ein weiteres Problem:
Das Script wird getriggert, wenn ich im Reiter "Zustände" den Wert der Systemvariable ändere.
Wenn allerdings die CCU die Systemvariable ändert wird das Script NICHT getriggert.
Ich habe die Sysvar auch mal manuell im HQ-WebUI geändert: Ergebnis: IOBroker zeigt die Änderung unter "Zustände" korrekt an, aber das Script läuft nicht los.
Es läuft also nur, wenn ich die Varible in IOBroker selber ändere.
Gruss Ralf
-
Hallo Pix, Bluefox
Ich habe, nachdem jetzt das Script läuft (mit kurzen Sätzen) ein weiteres Problem:
Das Script wird getriggert, wenn ich im Reiter "Zustände" den Wert der Systemvariable ändere.
Wenn allerdings die CCU die Systemvariable ändert wird das Script NICHT getriggert.
Ich habe die Sysvar auch mal manuell im HQ-WebUI geändert: Ergebnis: IOBroker zeigt die Änderung unter "Zustände" korrekt an, aber das Script läuft nicht los.
Es läuft also nur, wenn ich die Varible in IOBroker selber ändere.
Gruss Ralf `
Vielleicht stimmt Datentyp nicht. Kannst du mal dein Skript erweitern:on('DEINE_TRIGGER_VARIABLE', function (obj) { console.log(JSON.stringify(obj.newState)); });
und posten hier was kommt?
-
Hallo Bluefox
Habe folgende Ausgabe:
javascript.0 2015-11-22 19:08:41 info javascript.0 script.js.Test2: {"val":2,"ts":1448215722,"ack":true,"lc":1448215706,"from":"system.adapter.hm-rega.0"} javascript.0 2015-11-22 19:07:42 info javascript.0 script.js.Test2: {"val":1,"ts":1448215662,"ack":true,"lc":1448215655,"from":"system.adapter.hm-rega.0"} javascript-0 2015-11-22 19:05:12 info script.js.Test2: {"val":0,"ts":1448215512,"ack":true,"lc":1448215493,"from":"system.adapter.hm-rega.0"} sayit-0 2015-11-22 19:04:51 info saying: Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen hm-rega-0 2015-11-22 19:04:51 info State 37449 daueroffen javascript-0 2015-11-22 19:04:51 info script.js.Test2: {"val":"daueroffen","ts":1448215491,"ack":false,"lc":1448215491,"from":"system.adapter.admin.0"} javascript-0 2015-11-22 19:04:51 info script.js.Test2: Saying: Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen javascript-0 2015-11-22 19:04:42 info script.js.Test2: {"val":2,"ts":1448215482,"ack":true,"lc":1448215459,"from":"system.adapter.hm-rega.0"} javascript-0 2015-11-22 19:04:01 info script.js.Test2: registered 6 subscriptions and 0 schedules javascript-0 2015-11-22 19:04:00 info Start javascript script.js.Test2
Wurde aber wieder nur getriggert indem ich im IOBroker die Variable geändert habe.
Die letzten zwei JSON Augaben sind durch die Änderung der Variablen im HQ-WebUI entstanden. D.h. das Script scheint Deinen Triger ausgeführt zu haben, aber nicht meine. D.h. die Triggerbedingungen val und oder change:"ne" funktuonieren nicht?
Gruss Ralf
-
D.h. die Triggerbedingungen val und oder change:"ne" funktuonieren nicht? `
Die Triggerbedingungen funktionieren schon. Allerdings ist val vom Typ "number" (0, 1, 2) und nicht vom Typ "string" (z.B. "daueroffen").Wenn Du per admin einen string reinschreibst, wird dieser in newState.val übernommen, da offenbar keine Typprüfung erfolgt. Deshalb wird in diesem Fall getriggert.
-
Hallo Pix Bluefox
Ich glaube irgendwie hängt alles an den Triggerbedingungen;
Folgendermassen hat es jetzt funktioniert: Ich triggere einfach (wie im letzten BlueFox-Beispiel) auf die Variable. Ohne irgendwelche Bedingungen.
Dann frage ich den Zustand der Variablen von Hand ab und starte das entsprechende Unterprpgramm. Ist nicht ganz so elegant aber funktioniert nun:
var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser var idWaschmaschine = 'hm-rega.0.39968'; //STAT_Waschmaschine_fertig var idTrockner = 'hm-rega.0.44879'; //STAT_W.Trockner_fertig var idBad_daueroffen = 'hm-rega.0.37449'; //Badezimmer_Alarm_daueroffen. Werte: zu; daueroffen; zu lang offen var timer = {}; var debug = true; var repeat = false; // bei Skriptstart ausschalten on(idBad_daueroffen, function (obj) { console.log(JSON.stringify(obj.newState)); repeat = false; // Einmalige Ansage value = obj.newState.val; log('Get State=' + value); if (value == 1) { saySomething(idBad_daueroffen, 'Achtung. Das Badezimmerfenster ist schon lenger als 15 Minuten offen', repeat); } else if (value == 2) { repeat = true; saySomething(idBad_daueroffen, 'Das Badezimmerfenster ist schon lenger als eine halbe Stunde offen', repeat); } }); //----------------------------------------- Waschmaschine und Trockner -------------------------------- on(idWaschmaschine, function (obj) { console.log(JSON.stringify(obj.newState)); value = obj.newState.val; log('Get State=' + value); if (value == 0) { saySomething(idTrockner, 'Die Waschmaschine ist fertig', true); // wiederholen } }); on(idTrockner, function (obj) { console.log(JSON.stringify(obj.newState)); value = obj.oldState.val; log('Get State=' + value); if (value == 0) { saySomething(idTrockner, 'Der Trockner ist fertig', true); // wiederholen } }); function saySomething(idGeraet, text, wiederholung) { // Sage zum ersten Mal var d = new Date (); var h = d.getHours(); if (debug || (h < 22) && (h > 9)) // nur zwischen 9 und 20 Uhr { log('Saying: ' + text); setState(idSprache, text); if (wiederholung) { // Sag jede 10 Min Text an timer[idGeraet] = setInterval(function() { log('Timer[' + idGeraet + ']=' + timer[idGeraet]); log('Get State=' + getState(idGeraet).val); if (getState(idGeraet).val == 2) { log('Saying again: ' + text); setState(idSprache, text); } else { if (timer[idGeraet]) clearInterval(timer[idGeraet]); timer[idGeraet] = null; } }, 600000); } } }
Nichtsdestotrotz solten wir vielleicht doch klären und herausfinden warum die Trigger nicht so funktionieren wie man sich das vorstelt. Das hilft sicher auch Anderen.
Gruss Ralf
-
So sollte es auch funktionieren (Beispiel Waschmaschine):
on ({id: idWaschmaschine, val: 0}, function () { saySomething(idWaschmaschine, 'Die Waschmaschine ist fertig', false); // nicht wiederholen });
-
Hallo Paul, Hallo Bluefox, Hall Pix.
ZUm Beweis, dass es so wie Paul vorgeschlagen hat nicht geht, hab ich seinen Code eingebaut und weiter experimentiert.
Ich glaube ich habe es inzwischen geschnallt was nicht funktioniert:
Die Systemvariable ist ja eine Liste von Strings. Beispielsweise "aus, läuft, fertig". Die Indizes des zughörigen "Arrays"
sind 0,1 und 2
Jetzt kommt der Witz:
Wenn ich nach dem String triggere, also
on ({id: idWaschmaschine, val: "fertig"}, function ()
dann funktioniert das nur wenn ich die Variable im IOBroker ändere, aber nicht wenn die CCU diese ändert.
Wenn ich wie folgt triggere
on ({id: idWaschmaschine, val: 2}, function ()
Dann funktioniert es im IOBroker nicht mehr, dafür aber wenn die CCU die Variable ändert-
Hier läuft irgendwas gründlich schief. Aber den Fehler haben wir indirekt schon ein paar Seiten vorher entdeckt. Ich dacht nur nicht, dass es hier einen Unterschied gibt wer! die Variable setzt.
Wer kann sich denn diesen Bug mal angicken und fixen? Und: Könnt ihr das reproduzieren oder ist das nur bei mir so?
Gruss Ralf
-
Dann funktioniert es im IOBroker nicht mehr, dafür aber wenn die CCU die Variable ändert- `
Welche Version von ioBroker.admin verwendest Du ? Ab Version 0.6.4 wurde dies für Multistate-Datenpunkte (Werteliste) gefixt. -
Hallo Paul
Welche Version von ioBroker.admin verwendest Du ? Ab Version 0.6.4 wurde dies für Multistate-Datenpunkte (Werteliste) gefixt. `
Ich habe hier 0.5.11Das ist die Version die mit Hormoran's fertigem Image kommt.
Dann date ich denn wohl mal up. Mal sehen ob sich dann was ändert.
edit: Raaa! Nach dem Update sind alle meine Scripte weg!!!
Es lassen sich auch keine mehr hinzufügen. Was ist denn da schief gegangen? Kann ich noch was retten? Wo wären denn die Scripte gewesen? Kann ich ev. per Winscp noch was finden?
Noch eine Frage: Kann ich den Sayit direkt über html quatschen lassen?
So wie früher bei CCU.IO?
Da konnte man ja z.B. in der CCU folgendes programmieren
string url="'http://192.168.111.171:8080/api/set/72910/?value="blablabla"'"; dom.GetObject("CUxD.CUX2801002:1.CMD_EXEC").State("wget -q -O /dev/null " # url);
Und dann hat er schon gesprochen.
Wie geht denn das beim IOBroker?
Gruss Ralf
743_bild1.jpg -
Hallo?
Jemand da?
Lasst mich bitte nicht hängen. Irgendwie hab ich den IOBroker kaputt upgedatet.
Bevor ich jetzt alles platt mache würde ich gerne noch retten was zu retten ist…
Ich hoffe jemand kann mir da helfen.
Gruss Ralf