NEWS
Portierung CCU.IO
-
Hallo alle
Ich versuche grad die CCU.IO Scripte auf IOBroker zu portieren und hab da ein paar Schwierigkeiten.
Ich hatte z.B. mal ein Script das mir gemeldet hat wenn die Waschmaschine bzw. der Trockner fertig ist:
var idWaschmaschine = 39968; // Datenpunkt der Variable in CCU.IO bitte Nummer anpassen var idTrockner = 44879 var idSprache = 72910; // Sprachausgabe Browser var timerWash1 = null; var timerWash2 = null; subscribe ( { id: idWaschmaschine, change: 'ne' }, function (data) { // Sage zum ersten Mal var d = new Date (); var h = d.getHours(); if ((data.newState.value == 2) && (h < 22) && (h > 9)) // oder besser als Zahl der Wertelis dann ohne Haekchen (0 = aus, 1= laeuft, 2 = fertig) { setState(idSprache, 'Die Waschmaschine ist fertig'); log('Waschmaschine fertig'); // Sag jede 10 Min dass die Waesche fertig ist if (!timerWash1) { timerWash1 = setInterval(function() { if (getState(idWaschmaschine) == 2) { setState(idSprache, 'Die Waschmaschine ist fertig'); log('Waschmaschine fertig'); } else { clearInterval(timerWash1); timerWash1 = null; } }, 600000); } } } ); subscribe ( { id: idTrockner, change: 'ne' }, function (data) { // Sage zum ersten Mal var d = new Date (); var h = d.getHours(); if ((data.newState.value == 2) && (h < 22) && (h > 9)) // oder besser als Zahl der Wertelis dann ohne Haekchen (0 = aus, 1= laeuft, 2 = fertig) { setState(idSprache, 'Der Trockner ist fertig'); log('Trockner fertig'); // Sag jede 10 Min dass der Trockner fertig ist if (!timerWash2) { timerWash2 = setInterval(function() { if (getState(idTrockner) == 2) { setState(idSprache, 'Der Trockner ist fertig'); log('Trockner fertig'); } else { clearInterval(timerWash2); timerWash2 = null; } }, 600000); } } } );
Ich habe den Code für den ersten Schritt mal gekürzt und wollte mich stueckweise an den ursprünglichen Code herantasten. D.h. im ersten Schritt hab ich nur mal folgendes übernommen:
var idWaschmaschine = 'hm-rega.0.39968'; //*STAT_Waschmaschine_fertig*/ var idTrockner = 'hm-rega.0.44879'; //*STAT_W.Trockner_fertig*/ var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser var timerWash1 = null; var timerWash2 = null; on ( { id: 'hm-rega.0.39968', change: 'ne' }, function (data) { // Sage zum ersten Mal var d = new Date (); var h = d.getHours(); log ('Date:' + d); log ('Hour:' + h); setState(idSprache, 'Die Waschmaschine ist fertig'); log('Waschmaschine fertig'); } );
Mein erstes Probem ist: Die Logausgabe der Variable h, die über getHours() befüllt wird liefert entgegen mener Erwartung und auch entgegen dem was CCU.IO getan hat nicht die Stunden des Tages sondern den String "script.js.Waschmaschine_fertig: Date:Thu Oct 29 2015 20:13:59 GMT+0100 (CET)"
Muss ich noch irgendwo einen Parameter für das Zeitformat setzen oder ist das ein Bug?
Desweiteren: Die Id auf die ich hier triggere ist eine Systemvariable mit den Werten "aus", "läuft" und "fertig". Was muss ich genau tun, dass das Script nur bei "fertig" läuft?
Muss ich den Wert wie bei CCU.IO innerhalb des Scripts bestimmen? Oder kann ich irgendwie codieren (mit val:) dass es nur bei "fertig" getriggert wird? Wenn ja wie? weil sowohl val: 2 noch val: 'fertig' funktioniert.
Gruss Ralf
-
… vergesst das mit dem Datum. Ich hab meine Logs nicht richtig gelesen.
Bleibt erstmal also nur nur die Frage nach dem Trigger. Wenn das klappt versuche ich den Rest des Codes von CCU.IO rüber zu nehmen.
edit: Und da ist schon das nächste Problem:
In data.newState.val steht der Wert der Systemvariablen also "fertig"
Wenn ich nun im Script diesen Wert abfragen will:
if ( data.newState.val == 'fertig' && (h < 22) && (h > 9) ) { setState(idSprache, 'Die Waschmaschine ist fertig'); log('Waschmaschine fertig'); }
Dann bekomme ich folgende Fehler im Log
sayit-0 2015-10-29 21:39:52 error Can't find a suitable libao driver. (Is device in use?) sayit-0 2015-10-29 21:39:52 error MPEG 2.0 layer III, 32 kbit/s, 16000 Hz mono sayit-0 2015-10-29 21:39:52 error Playing MPEG stream from 0707321d3cc8db96e241c28fd7545abc.mp3 ... sayit-0 2015-10-29 21:39:52 error Directory: /opt/iobroker/cache sayit-0 2015-10-29 21:39:52 error tcgetattr(): Inappropriate ioctl for device sayit-0 2015-10-29 21:39:52 error THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK! sayit-0 2015-10-29 21:39:52 error Uses code from various people. See 'README' for more! sayit-0 2015-10-29 21:39:52 error now maintained by Nanakos Chrysostomos and others. sayit-0 2015-10-29 21:39:52 error Version 0.3.2-1 (2012/03/25). Written and copyrights by Joe Drew, sayit-0 2015-10-29 21:39:52 error High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3. sayit-0 2015-10-29 21:39:52 error Cannot play:Error: Command failed: /bin/sh -c mpg321 /opt/iobroker/cache/0707321d3cc8db96e241c28fd7545abc.mp3
Lasse ich die Abfrage auf data.newState.val weg, also so
if ( (h < 22) && (h > 9) ) { setState(idSprache, 'Die Waschmaschine ist fertig'); log('Waschmaschine fertig'); }
Dann tut alles.
Ich sehe jetzt ehrlich gesagt nicht den Fehler in dieser String-Abfrage. Und noch weniger verstehe ich das Log. Warum kann der IOBroker plötzlich das mp3 nicht abspielen bzw. findet keine Treiber?
Gruss Ralf
-
> Can't find a suitable libao driver. (Is device in use?)
Ich denke, das ist einfach Timing gewesen. Wenn du jetzt ausführst, dann wird es gehen. -
Hi Bluefox
@Bluefox:> Can't find a suitable libao driver. (Is device in use?)
Ich denke, das ist einfach Timing gewesen. Wenn du jetzt ausführst, dann wird es gehen. `
Tatsächlich!Aber was bedeudet das genau? Dass man zwischen zwei Ansagen eine gewissen Zeit verstreichen lassen muss?
Wieviel wäre das und warum?
Kannst Du mir noch sagen ob ich überhaupt nach data.newState.val == 'fertig' abfragen muss oder kann ich einstellen dass der Coder erst dann getriggert wird wenn die Sys-Var = fertig ist?
ich dachte man kann das so machen, geht aber nicht:
on ( { id: 'hm-rega.0.39968', change: 'ne' val: 'fertig' }, function (data) {..});
Und noch ne Frage: Ich würde gerne function (data) {} in unterschiedlichen on Statements mit verschiedenen Texten für Sayit verwenden. Das heisst ich würde der function gerne den Text der gesagt werden soll übergeben. Wie geht das?
So funktioniert es auf jeden Fall
on ( { id: 'hm-rega.0.39968', change: 'ne' val: 'fertig' }, message); function message(data) {..};
Aber wie übergebe ich der function message die Message? Im on-statement wird ja offensichtlich nur der Name erwartet. D.h. ich muss den Text über data übergeben? Aber wie krieg ich ihn da rein?
Gruss Ralf
-
Erstens, ich bin immer noch nicht sicher, was für einen Wert deine Variable hat: "2" oder "fertig"
Zweitens: change: 'ne' heißt trigger "not equal". Du brauchst aber "eq" - "equal.
Das heißt es geht wieder nur zufällig.
Eigentlich muss es so sein:
on (
{
id: 'hm-rega.0.39968',
change: 'eq'
val: 2
}, function (obj) {..});
Aber erst musst du raus finden ob es 2 oder fertig ist.
-
Hallo Bluefox
@Bluefox:Erstens, ich bin immer noch nicht sicher, was für einen Wert deine Variable hat: "2" oder "fertig"
Zweitens: change: 'ne' heißt trigger "not equal". Du brauchst aber "eq" - "equal. `
Ich habe jetzt ein wenig rumprobiert. Es muss so heissen:on ( { id: idWaschmaschine, change: 'ne', val: 'fertig' }, function (data) {
Ich habe erst ewig mit "eq" rumgetestet, aber eigentlich ist es logisch, dass es "ne" heissen muss, denn es wird wohl immer erst dann getriggert, wenn sich der Wert der Systemvariablen gegenüber dem Alten geändert hat. Also wie bei der CCU ein Trigger auf "Änderung". Val: 'fertig' prüft dann ob der neue Wert 'fertig' ist. Das ist übrigens ein Unterschied zu CCU.IO wo der Array Index übergeben wurde, statt dessen Wert.
Mein Code sieht also nun so aus und funktoniert:
var idWaschmaschine = 'hm-rega.0.39968'; //*STAT_Waschmaschine_fertig*/ var idTrockner = 'hm-rega.0.44879'; //*STAT_W.Trockner_fertig*/ var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser var timerWash1 = null; var timerWash2 = null; on ( { id: idWaschmaschine, change: 'ne', val: 'fertig' }, function (data) { // Sage zum ersten Mal var d = new Date (); var h = d.getHours(); if ( (h < 22) && (h > 9)) // nur zwischen 9 und 20 Uhr { log('Waschmaschine fertig 2'); setState(idSprache, 'Die Waschmaschine ist fertig'); // Sag jede 10 Min dass die Waesche fertig ist log('Timerwash='+timerWash1); if (!timerWash1) { timerWash1 = setInterval(function() { log('Timerwash=' + timerWash1); log('Get State=' + getState(idWaschmaschine).val); if (getState(idWaschmaschine).val == 'fertig') { setState(idSprache, 'Die Waschmaschine ist fertig'); log('Waschmaschine fertig'); } else { clearInterval(timerWash1); timerWash1 = null; } }, 600000); } } } );
Jetzt brauchen ich noch einen Tipp um das Ganze zu optimieren.
Und zwar möchte ich noch eine andere Systemvariable beobachten und bei deren Änderung den gleichen Code laufen-, aber eine andere Meldung ausgeben lassen. D.h. ich müsste der aufgerufenen Funktion irgendwie einen Parameter (den zu sprechenden Text) mitgeben. Aber wie geht das?
Gruss Ralf
-
Hallo,
function say (ansage) { setState (idSprache, ansage); // ggf. Zur Sicherheit ansage.toString } // Aufruf say ('Das ist die Ansage');
Meinst du das?
Gruß,
Pix
Gesendet von meinem iPhone mit Tapatalk
-
Hi Pix
@pix:Meinst du das? `
Nee.Ich meine Folgendes:
Das Prinzip auf eine Änderung zu reagieren ist ja das Folgende:
on ( {id: sysVariable, change: 'ne', }, meineFunktion ); function meineFunktion(data) { .... //viel Code setState(idSprache, zuSagenderText); }
Mein Problem ist nun: Ich würde die Funktion "meineFunktion" an mehreren Stellen verwenden (also auch wenn sich z.B eine andere Systemvariablen die ich mit on ({id: andereSysVar …); beobachte ändert.
Da aber in der on-Syntax nur der Name der Funktion, die aufgerufen werden soll, angegeben wird, kann man da ja scheinbar dieser keine Parameter mitgeben. Ich müsste aber zumindest den zu sprechenden Text mitgeben, der ja bei einer anderen SysVar anders sein muss (z.B. statt "Die Waschmaschine ist fertig", "Der Trockner ist fertig".
Gruss Ralf
-
Tut mir leid, mir ist noch nicht klar was du meinst. Kannst du etwas deutlicher werden?
Du überwachst die Waschmaschine. Wenn sie fertig ist und es ist tagsüber, wird ein Text ("Waschmaschine fertig") angesagt. Wann sollte der Text noch angesagt werden? Und warum sollte ein anderer Text angesagt werden, bei gleichem Trigger?
Tut mir leid, erklär es einfach nochmal anders herum.
Gruß,
Pix
Edit:
Das Prinzip, auf eine Änderung zu reagieren ist doch eigentlich so:
on ( {id: sysVariable, change: 'ne', }, function () { // viel Code meineFunktion('Ansagetext');// zB }); function meineFunktion(zuSagenderText) { setState(idSprache, zuSagenderText); }
-
Hallo Pix
@pix:Tut mir leid, mir ist noch nicht klar was du meinst.
…
on ( {id: sysVariable, change: 'ne', }, function () { // viel Code meineFunktion('Ansagetext');// zB }); function meineFunktion(zuSagenderText) { setState(idSprache, zuSagenderText); } ```` `
Du hast mir trotzdem die Lösung gezeigt! Super!
Der Trick war der die Verschachtelung der beiden Funktionen:````
function () {
// viel Code
meineFunktion('Ansagetext');// zB
}ABER: Wenn ich das so mache:
var idWaschmaschine = 'hm-rega.0.39968'; //*STAT_Waschmaschine_fertig*/ var idTrockner = 'hm-rega.0.44879'; //*STAT_W.Trockner_fertig*/ var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser var timerWash1 = null; var timerWash2 = null; var debug = true;
on (
{
id: idWaschmaschine,
change: 'ne',
val: 'fertig'
},
function (data)
{
sayFinish(data, 'Die Waschmaschine ist fertig');
}
);on (
{
id: idTrockner,
change: 'ne',
val: 'fertig'
},
function (data)
{
sayFinish(data, 'Der Trockner ist fertig');
}
);function sayFinish(data, text)
{
// 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); // Sag jede 10 Min Text an log('Timerwash='+timerWash2); if (!timerWash2) { timerWash1 = setInterval( function() { log('Timerwash=' + timerWash2); log('Get State=' + getState(idWaschmaschine).val); if (getState(idWaschmaschine).val == 'fertig') { setState(idSprache, text); log('Saying: '+text); } else { clearInterval(timerWash2); timerWash2 = null; } }, 600000 ); } }
}
Dann funktionert es bei der ersten Variable, aber bei der zweiten (die den gleichen Code nutzt) kackt der Adapter ab. Ich denke das ist nicht das Timing Problem von letztem Mal, sondern irgend was anders…:
bananapi 2015-11-01 02:30:46 info host.bananapi Restart adapter system.adapter.sayit.0 because enabled
bananapi 2015-11-01 02:30:46 error host.bananapi instance system.adapter.sayit.0 terminated with code 6 (uncaught exception)
sayit.0 2015-11-01 02:30:46 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-01 02:30:46 error uncaught exception: socket hang up
sayit.0 2015-11-01 02:30:46 error Error: connect EHOSTUNREACH at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19)
sayit.0 2015-11-01 02:30:46 error uncaught exception: connect EHOSTUNREACH
sayit-0 2015-11-01 02:30:43 info saying: Der Trockner ist fertig
javascript-0 2015-11-01 02:30:43 info script.js.Waschmaschine_fertig: Timerwash=null
javascript-0 2015-11-01 02:30:43 info script.js.Waschmaschine_fertig: Saying: Der Trockner ist fertig
hm-rega-0 2015-11-01 02:30:43 info State 44879 fertig
hm-rega-0 2015-11-01 02:30:37 info State 44879
sayit-0 2015-11-01 02:30:22 info saying: Die Waschmaschine ist fertig
javascript-0 2015-11-01 02:30:22 info script.js.Waschmaschine_fertig: Timerwash=null
javascript-0 2015-11-01 02:30:22 info script.js.Waschmaschine_fertig: Saying: Die Waschmaschine ist fertig
hm-rega-0 2015-11-01 02:30:22 info State 39968 fertig
sayit-0 2015-11-01 02:30:05 info Upload announce mp3 files
sayit-0 2015-11-01 02:30:05 info starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit
host-bananapi 2015-11-01 02:29:59 info instance system.adapter.sayit.0 started with pid 3119
javascript-0 2015-11-01 02:29:41 info script.js.Waschmaschine_fertig: Timerwash=null
hm-rega-0 2015-11-01 02:29:41 info State 44879 fertigImmerhin bin ich einen Schritt weiter. Danke dafür. Gruss Ralf
-
Hallo,
@derrapf:sayFinish(data, 'Der Trockner ist fertig'); function sayFinish(data, text) ```` `
Lass bei diesen Zeilen das data bitte mal weg.
Schwer zu tippen auf dem iPhone mit Tapatalk
Gruß,
Pix
Gesendet von meinem iPhone mit Tapatalk
-
Ich vermute, dass
clearInterval(timerWash2);
Macht Probleme. Bei dir wird doch timerWash2 nirgendwo gesetzt.
Mach so:
if (timerWash2) clearInterval(timerWash2);
Obwohl ich verstehe nicht ganz, was genau du machen willst.
Auch "ne" ist falsch.
Was siehst du beim Aufruf:
cd /opt/iobroker iobroker state get hm-rega.0.39968
-
Hallo Bluefox, Hallo Pix
@Bluefox:Ich vermute, dass
clearInterval(timerWash2);
Macht Probleme. Bei dir wird doch timerWash2 nirgendwo gesetzt. `
Das war natuerlich alles völliger Mist was ich da zusammenprogrammiert hatte. Kommt davon, wenn man nachts totmüde mit cut copy paste programmiert.Ich habe die Funktion jetzt von unbenutzten Variablen gereingt. Die Timer Variable soll dafür verwendet werden ,dass mir das System alle 10 Minuten mit dieser Meldung auf die Nerven geht, bis ich die Maschine ausgeschaltet habe.
Da ich die data Variable erstmal nicht brauche, habe ich Sie wie Pix geraten hatte entsorgt. Hat aber leider nichts genutzt.
Auch "ne" ist falsch. `
Da würde ich Dir widersprechen wollen: "ne" soll ja triggern wenn der Wert sich geändert hat, also not equal zum vorherigen ist.Mit val:'fertig' prüfe ich dann ob der Wert "fertig" ist.
Was siehst du beim Aufruf:
cd /opt/iobroker iobroker state get hm-rega.0.39968 ```` `
Da kommt folgendes (ich habs mal für Beide gemacht):
root@bananapi:~# cd /opt/iobroker root@bananapi:/opt/iobroker# iobroker state get hm-rega.0.39968 {"val":0,"ack":true,"ts":1446410115,"from":"system.adapter.hm-rega.0","lc":1446410108} root@bananapi:/opt/iobroker# iobroker state get hm-rega.0.44879 {"val":0,"ack":true,"ts":1446410776,"from":"system.adapter.hm-rega.0","lc":1446410022}
Sehe ich das richtig, dass dann val nicht auf "fertig" geprüft werden muss, sondern auf 2? (0="aus", 1="läuft", 2="fertig")
Der Code sieht jetzt so aus (Ich hab sogar mal val: rausgenommen und de Timervariable aus 6s runtergesetzt, damit man leichter sieht ob's geht):
var idWaschmaschine = 'hm-rega.0.39968'; //*STAT_Waschmaschine_fertig*/ var idTrockner = 'hm-rega.0.44879'; //*STAT_W.Trockner_fertig*/ var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser // var timer = null; var debug = true; on ( { id: idWaschmaschine, change: 'ne' }, function (data) { sayFinish(idWaschmaschine, 'Die Waschmaschine ist fertig'); } ); on ( { id: idTrockner, change: 'ne' }, function (data) { sayFinish(idTrockner, 'Der Trockner ist fertig'); } ); function sayFinish(idGeraet, text) { // 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); // Sag jede 10 Min Text an var timer = setInterval( function() { log('Timer=' + timer); log('Get State=' + getState(idGeraet).val); if (getState(idGeraet).val == 'fertig') { setState(idSprache, text); log('Saying again: '+text); } else { clearInterval(timer); timer = null; } }, 6000 ); } }
Aber immer noch unverändertes Verhalten. Der Trigger auf die Sysvar der Waschmaschine funktioniert, der Trigger auf die des Wäschetrockners nicht:
sayit.0 2015-11-01 22:30:35 info sayit.0 Upload announce mp3 files sayit.0 2015-11-01 22:30:35 info sayit.0 starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit bananapi 2015-11-01 22:30:31 info host.bananapi instance system.adapter.sayit.0 started with pid 3900 javascript.0 2015-11-01 22:30:23 info javascript.0 script.js.Geraete_sind_fertig: Get State=0 javascript.0 2015-11-01 22:30:23 info javascript.0 script.js.Geraete_sind_fertig: Timer=[object Object] javascript.0 2015-11-01 22:30:21 info javascript.0 script.js.Geraete_sind_fertig: Get State=0 javascript.0 2015-11-01 22:30:21 info javascript.0 script.js.Geraete_sind_fertig: Timer=[object Object] javascript.0 2015-11-01 22:30:17 info javascript.0 script.js.Geraete_sind_fertig: Saying: Der Trockner ist fertig javascript.0 2015-11-01 22:30:15 info javascript.0 script.js.Geraete_sind_fertig: Saying again: Der Trockner ist fertig javascript.0 2015-11-01 22:30:15 info javascript.0 script.js.Geraete_sind_fertig: Get State=fertig javascript.0 2015-11-01 22:30:15 info javascript.0 script.js.Geraete_sind_fertig: Timer=[object Object] javascript.0 2015-11-01 22:30:09 info javascript.0 script.js.Geraete_sind_fertig: Saying again: Der Trockner ist fertig javascript.0 2015-11-01 22:30:09 info javascript.0 script.js.Geraete_sind_fertig: Get State=fertig javascript.0 2015-11-01 22:30:09 info javascript.0 script.js.Geraete_sind_fertig: Timer=[object Object] javascript.0 2015-11-01 22:30:03 info javascript.0 script.js.Geraete_sind_fertig: Saying again: Der Trockner ist fertig javascript.0 2015-11-01 22:30:03 info javascript.0 script.js.Geraete_sind_fertig: Get State=fertig javascript.0 2015-11-01 22:30:03 info javascript.0 script.js.Geraete_sind_fertig: Timer=[object Object] bananapi 2015-11-01 22:30:01 info host.bananapi Restart adapter system.adapter.sayit.0 because enabled bananapi 2015-11-01 22:30:01 error host.bananapi instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) sayit.0 2015-11-01 22:30:00 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-01 22:30:00 error uncaught exception: socket hang up sayit.0 2015-11-01 22:30:00 error Error: connect EHOSTUNREACH at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) sayit.0 2015-11-01 22:30:00 error uncaught exception: connect EHOSTUNREACH sayit-0 2015-11-01 22:29:57 info saying: Der Trockner ist fertig hm-rega-0 2015-11-01 22:29:57 info State 44879 fertig javascript-0 2015-11-01 22:29:57 info script.js.Geraete_sind_fertig: Saying: Der Trockner ist fertig javascript-0 2015-11-01 22:29:22 info script.js.Geraete_sind_fertig: Get State=0 javascript-0 2015-11-01 22:29:22 info script.js.Geraete_sind_fertig: Timer=[object Object] javascript-0 2015-11-01 22:29:18 info script.js.Geraete_sind_fertig: Get State=0 javascript-0 2015-11-01 22:29:18 info script.js.Geraete_sind_fertig: Timer=[object Object] sayit-0 2015-11-01 22:29:17 info saying: Die Waschmaschine ist fertig javascript-0 2015-11-01 22:29:16 info script.js.Geraete_sind_fertig: Saying: Die Waschmaschine ist fertig sayit-0 2015-11-01 22:29:12 info saying: Die Waschmaschine ist fertig javascript-0 2015-11-01 22:29:12 info script.js.Geraete_sind_fertig: Saying again: Die Waschmaschine ist fertig javascript-0 2015-11-01 22:29:12 info script.js.Geraete_sind_fertig: Get State=fertig javascript-0 2015-11-01 22:29:12 info script.js.Geraete_sind_fertig: Timer=[object Object] sayit-0 2015-11-01 22:29:06 info saying: Die Waschmaschine ist fertig javascript-0 2015-11-01 22:29:06 info script.js.Geraete_sind_fertig: Saying again: Die Waschmaschine ist fertig javascript-0 2015-11-01 22:29:06 info script.js.Geraete_sind_fertig: Get State=fertig javascript-0 2015-11-01 22:29:06 info script.js.Geraete_sind_fertig: Timer=[object Object] sayit-0 2015-11-01 22:29:00 info saying: Die Waschmaschine ist fertig hm-rega-0 2015-11-01 22:29:00 info State 39968 fertig
Beide Variablen sind in der CCU aber gleich definiert.
Gruss Ralf
-
Probier mal so:
var idWaschmaschine = 'hm-rega.0.39968'; //*STAT_Waschmaschine_fertig*/ var idTrockner = 'hm-rega.0.44879'; //*STAT_W.Trockner_fertig*/ var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser var debug = true; on ({id: idWaschmaschine, val: 2}, function (data) { sayFinish(idWaschmaschine, 'Die Waschmaschine ist fertig'); }); on ({id: idTrockner, val: 2}, function (data) { sayFinish(idTrockner, 'Die Waschmaschine ist fertig'); }); var timer = {}; function sayFinish(idGeraet, text) { // 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); // 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) { setState(idSprache, text); log('Saying again: ' + text); } else { if (timer[idGeraet]) clearInterval(timer[idGeraet]); timer[idGeraet] = null; } }, 60000); } }
Es konnte trotzdem noch sein, dass timer war null.
-
Hallo Bluefox
Alles Voodoo. Ich verstehe es nicht: Dein Code triggert nicht die Änderung der System Variable.
Also
on ({id: idWaschmaschine, val: 2}, function (data) { sayFinish(idWaschmaschine, 'Die Waschmaschine ist fertig'); });
Funktioniert nicht.
Ich hab den Code ergänzt und wieder change 'ne' eingebaut, aber auch dann hat er nicht getriggert.
Erst als ich geschrieben habe
on ({id: idWaschmaschine}, function (data) { sayFinish(idWaschmaschine, 'Die Waschmaschine ist fertig'); });
Wurde wieder getriggert, aber jetzt kommts: Ich habe keinen Fehler wenn idWaschmaschine getriggert wird, aber solbad idTrockner triggert kommt wieder der Fehler wie in meinem letzten Post.
Muss man das verstehen???
Gruss Ralf
743_bild1.jpg -
Nächster Effekt:
Die Scriptengine scheint in einer Endlosschleife zu sein. Im Log tauchen nun ständig folgende Sequenzen auf und wiederholen sich immer wieder:
sayit.0 2015-11-03 22:16:39 info sayit.0 Upload announce mp3 files sayit.0 2015-11-03 22:16:39 info sayit.0 starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit bananapi 2015-11-03 22:16:35 info host.bananapi instance system.adapter.sayit.0 started with pid 5070 bananapi 2015-11-03 22:16:05 info host.bananapi Restart adapter system.adapter.sayit.0 because enabled bananapi 2015-11-03 22:16:05 error host.bananapi instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) sayit.0 2015-11-03 22:16:01 info sayit.0 saying: Der Trockner ist fertig javascript.0 2015-11-03 22:15:41 info javascript.0 script.js.Test2: registered 1 subscription and 0 schedules javascript.0 2015-11-03 22:15:41 info javascript.0 Start javascript script.js.Test2 javascript.0 2015-11-03 22:15:41 info javascript.0 received all states javascript.0 2015-11-03 22:15:41 info javascript.0 received all objects sayit.0 2015-11-03 22:15:40 info sayit.0 Upload announce mp3 files sayit.0 2015-11-03 22:15:40 info sayit.0 starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit javascript.0 2015-11-03 22:15:36 info javascript.0 requesting all objects javascript.0 2015-11-03 22:15:36 info javascript.0 requesting all states javascript-0 2015-11-03 22:15:36 info requesting all objects javascript-0 2015-11-03 22:15:36 info requesting all states javascript-0 2015-11-03 22:15:36 info starting. Version 0.5.7 in /opt/iobroker/node_modules/iobroker.javascript host-bananapi 2015-11-03 22:15:33 info instance system.adapter.sayit.0 started with pid 5058 host-bananapi 2015-11-03 22:15:23 info instance system.adapter.javascript.0 started with pid 5055 host-bananapi 2015-11-03 22:15:21 info instance system.adapter.javascript.0 terminated with code 0 (OK) host-bananapi 2015-11-03 22:15:20 info stopInstance system.adapter.javascript.0 killing pid 2485 host-bananapi 2015-11-03 22:15:20 info stopInstance system.adapter.javascript.0 host-bananapi 2015-11-03 22:15:20 info object change system.adapter.javascript.0 host-bananapi 2015-11-03 22:15:03 info Restart adapter system.adapter.sayit.0 because enabled host-bananapi 2015-11-03 22:15:03 error instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) Error: 2015-11-03 22:15:03 error at TCP.close (net.js:485:12) Error: 2015-11-03 22:15:03 error at TLSSocket.emit (events.js:129:20) Error: 2015-11-03 22:15:03 error at TLSSocket.socketCloseListener (_http_client.js:247:23) Error: 2015-11-03 22:15:03 error at createHangUpError (_http_client.js:215:15) Error: 2015-11-03 22:15:03 error socket hang up uncaught 2015-11-03 22:15:03 error exception: socket hang up Error: 2015-11-03 22:15:03 error at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) Error: 2015-11-03 22:15:03 error at exports._errnoException (util.js:746:11) Error: 2015-11-03 22:15:03 error connect EHOSTUNREACH uncaught 2015-11-03 22:15:03 error exception: connect EHOSTUNREACH sayit-0 2015-11-03 22:15:00 info saying: Der Trockner ist fertig
Auch nach dem Restart von iobroker loggt er diese Sequenz immer wieder.
Wie kann ich das denn abbrechen?
Gruss Ralf
-
Wenn du sayit deaktivierst. Passiert immer noch?
-
Hab grad mal getestet:
Wenn ich alle Scripte deaktiviere ist Ruhe.
Ich habe ein Testscript mal eben aktiviert:
var idTrockner = 'hm-rega.0.44879'; //*STAT_W.Trockner_fertig*/ var idSprache = 'sayit.0.tts.text'; // Sprachausgabe Browser on ({id: idTrockner}, function (data) { sayFinish(idTrockner, 'Der Trockner ist fertig'); }); function sayFinish(idGeraet, text) { setState(idSprache, text); }
Sobald das aktiviert st kommen die Logs. Ohne dass überhaupt ein Wert von idTrockner geändert wird.
bananapi 2015-11-03 22:56:02 info host.bananapi instance system.adapter.sayit.0 started with pid 5408 bananapi 2015-11-03 22:56:02 info host.bananapi instance system.adapter.sayit.0 started with pid 5408 hm-rega.0 2015-11-03 22:55:58 info hm-rega.0 State 46031 650 hm-rega.0 2015-11-03 22:55:58 info hm-rega.0 State 46030 1019 hm-rega.0 2015-11-03 22:55:57 info hm-rega.0 State 36952 7.87 hm-rega.0 2015-11-03 22:55:57 info hm-rega.0 State 36816 8.32 hm-rega.0 2015-11-03 22:55:57 info hm-rega.0 State 36815 7.97 hm-rega.0 2015-11-03 22:55:56 info hm-rega.0 State 34330 5.3 hm-rega.0 2015-11-03 22:55:56 info hm-rega.0 State 34124 101954 hm-rega.0 2015-11-03 22:55:56 info hm-rega.0 State 34122 9.82 hm-rega.0 2015-11-03 22:55:56 info hm-rega.0 State 32642 78 hm-rega.0 2015-11-03 22:55:55 info hm-rega.0 State 12338 10 hm-rega.0 2015-11-03 22:55:55 info hm-rega.0 State 11970 6.1 bananapi 2015-11-03 22:55:32 info host.bananapi Restart adapter system.adapter.sayit.0 because enabled bananapi 2015-11-03 22:55:32 error host.bananapi instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) bananapi 2015-11-03 22:55:32 info host.bananapi Restart adapter system.adapter.sayit.0 because enabled bananapi 2015-11-03 22:55:32 error host.bananapi instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) Error: 2015-11-03 22:55:31 error at TCP.close (net.js:485:12) Error: 2015-11-03 22:55:31 error at TLSSocket.emit (events.js:129:20) Error: 2015-11-03 22:55:31 error at TLSSocket.socketCloseListener (_http_client.js:247:23) Error: 2015-11-03 22:55:31 error at createHangUpError (_http_client.js:215:15) Error: 2015-11-03 22:55:31 error socket hang up uncaught 2015-11-03 22:55:31 error exception: socket hang up Error: 2015-11-03 22:55:31 error at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) Error: 2015-11-03 22:55:31 error at exports._errnoException (util.js:746:11) Error: 2015-11-03 22:55:31 error connect EHOSTUNREACH uncaught 2015-11-03 22:55:31 error exception: connect EHOSTUNREACH hm-rega-0 2015-11-03 22:55:28 info State 46031 650 hm-rega-0 2015-11-03 22:55:28 info State 46030 1019 sayit-0 2015-11-03 22:55:28 info saying: Der Trockner ist fertig hm-rega-0 2015-11-03 22:55:27 info State 36952 7.87 hm-rega-0 2015-11-03 22:55:27 info State 36816 8.32 hm-rega-0 2015-11-03 22:55:27 info State 36815 7.97 hm-rega-0 2015-11-03 22:55:26 info State 34330 5.3 hm-rega-0 2015-11-03 22:55:26 info State 34124 101954 hm-rega-0 2015-11-03 22:55:26 info State 34122 9.82 hm-rega-0 2015-11-03 22:55:26 info State 32642 78 hm-rega-0 2015-11-03 22:55:25 info State 12338 10 hm-rega-0 2015-11-03 22:55:25 info State 11970 6.1 sayit-0 2015-11-03 22:55:06 info Upload announce mp3 files sayit-0 2015-11-03 22:55:06 info starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit host-bananapi 2015-11-03 22:55:02 info instance system.adapter.sayit.0 started with pid 5400 hm-rega-0 2015-11-03 22:54:58 info State 46717 41.4 hm-rega-0 2015-11-03 22:54:58 info State 46031 647 hm-rega-0 2015-11-03 22:54:58 info State 46030 1018 hm-rega-0 2015-11-03 22:54:57 info State 36952 7.87 hm-rega-0 2015-11-03 22:54:57 info State 36816 8.32 hm-rega-0 2015-11-03 22:54:57 info State 36815 7.97 hm-rega-0 2015-11-03 22:54:56 info State 34330 5.3 hm-rega-0 2015-11-03 22:54:56 info State 34124 101954 hm-rega-0 2015-11-03 22:54:56 info State 34122 9.82 hm-rega-0 2015-11-03 22:54:56 info State 32642 78 hm-rega-0 2015-11-03 22:54:55 info State 12338 10 hm-rega-0 2015-11-03 22:54:55 info State 11970 6.1 host-bananapi 2015-11-03 22:54:32 info Restart adapter system.adapter.sayit.0 because enabled host-bananapi 2015-11-03 22:54:32 error instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) Error: 2015-11-03 22:54:31 error at TCP.close (net.js:485:12) Error: 2015-11-03 22:54:31 error at TLSSocket.emit (events.js:129:20) Error: 2015-11-03 22:54:31 error at TLSSocket.socketCloseListener (_http_client.js:247:23) Error: 2015-11-03 22:54:31 error at createHangUpError (_http_client.js:215:15) Error: 2015-11-03 22:54:31 error socket hang up uncaught 2015-11-03 22:54:31 error exception: socket hang up Error: 2015-11-03 22:54:31 error at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) Error: 2015-11-03 22:54:31 error at exports._errnoException (util.js:746:11) Error: 2015-11-03 22:54:31 error connect EHOSTUNREACH uncaught 2015-11-03 22:54:31 error exception: connect EHOSTUNREACH hm-rega-0 2015-11-03 22:54:28 info State 46717 41.4 hm-rega-0 2015-11-03 22:54:28 info State 46031 647 hm-rega-0 2015-11-03 22:54:28 info State 46030 1018 sayit-0 2015-11-03 22:54:28 info saying: Der Trockner ist fertig hm-rega-0 2015-11-03 22:54:26 info State 36952 7.87 hm-rega-0 2015-11-03 22:54:26 info State 36816 8.32 hm-rega-0 2015-11-03 22:54:26 info State 36815 7.97 hm-rega-0 2015-11-03 22:54:26 info State 34330 5.3 hm-rega-0 2015-11-03 22:54:26 info State 34124 101954 hm-rega-0 2015-11-03 22:54:26 info State 34122 9.82 hm-rega-0 2015-11-03 22:54:25 info State 32642 78 hm-rega-0 2015-11-03 22:54:24 info State 12338 10 hm-rega-0 2015-11-03 22:54:24 info State 11970 6.1 sayit-0 2015-11-03 22:54:06 info Upload announce mp3 files sayit-0 2015-11-03 22:54:06 info starting. Version 0.3.11 in /opt/iobroker/node_modules/iobroker.sayit host-bananapi 2015-11-03 22:54:02 info instance system.adapter.sayit.0 started with pid 5392 hm-rega-0 2015-11-03 22:53:58 info State 46717 41.4 hm-rega-0 2015-11-03 22:53:58 info State 46031 647 hm-rega-0 2015-11-03 22:53:58 info State 46030 1018 hm-rega-0 2015-11-03 22:53:57 info State 36952 7.87 hm-rega-0 2015-11-03 22:53:57 info State 36816 8.32 hm-rega-0 2015-11-03 22:53:57 info State 36815 7.97 hm-rega-0 2015-11-03 22:53:56 info State 34330 5.3 hm-rega-0 2015-11-03 22:53:56 info State 34124 101954 hm-rega-0 2015-11-03 22:53:56 info State 34122 9.82 hm-rega-0 2015-11-03 22:53:56 info State 32642 78 hm-rega-0 2015-11-03 22:53:55 info State 12338 10 hm-rega-0 2015-11-03 22:53:55 info State 11970 6.1 host-bananapi 2015-11-03 22:53:32 info Restart adapter system.adapter.sayit.0 because enabled host-bananapi 2015-11-03 22:53:32 error instance system.adapter.sayit.0 terminated with code 6 (uncaught exception) Error: 2015-11-03 22:53:32 error at TCP.close (net.js:485:12) Error: 2015-11-03 22:53:32 error at TLSSocket.emit (events.js:129:20) Error: 2015-11-03 22:53:32 error at TLSSocket.socketCloseListener (_http_client.js:247:23) Error: 2015-11-03 22:53:32 error at createHangUpError (_http_client.js:215:15) Error: 2015-11-03 22:53:32 error socket hang up uncaught 2015-11-03 22:53:32 error exception: socket hang up Error: 2015-11-03 22:53:32 error at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1010:19) Error: 2015-11-03 22:53:32 error at exports._errnoException (util.js:746:11) Error: 2015-11-03 22:53:32 error connect EHOSTUNREACH uncaught 2015-11-03 22:53:32 error exception: connect EHOSTUNREACH hm-rega-0 2015-11-03 22:53:29 info State 46717 41.4 sayit-0 2015-11-03 22:53:28 info saying: Der Trockner ist fertig hm-rega-0 2015-11-03 22:53:29 info State 46031 647 hm-rega-0 2015-11-03 22:53:29 info State 46030 1018 hm-rega-0 2015-11-03 22:53:27 info State 36952 7.87 hm-rega-0 2015-11-03 22:53:27 info State 36816 8.32 hm-rega-0 2015-11-03 22:53:27 info State 36815 7.97 hm-rega-0 2015-11-03 22:53:27 info State 34330 5.3 hm-rega-0 2015-11-03 22:53:27 info State 34124 101954 hm-rega-0 2015-11-03 22:53:27 info State 34122 9.82 hm-rega-0 2015-11-03 22:53:26 info State 32642 78 hm-rega-0 2015-11-03 22:53:25 info State 12338 10 hm-rega-0 2015-11-03 22:53:25 info State 11970 6.1 javascript-0 2015-11-03 22:53:03 info script.js.Test2: registered 1 subscription and 0 schedules javascript-0 2015-11-03 22:53:03 info Start javascript script.js.Test2
Gruss Ralf
-
Wenn du die Variable sayit.0.tts.text händisch beschreibst (aus admin), kannst du was hören?
-
Ah!
Ich weiss warum das Dings loopt:
Weil ich nur geschrieben habe:
on ({id: idTrockner'}, function (data) { sayFinish(idTrockner, 'Der Trockner ist fertig'); });
Soll das so sein?
Wenn ich change: 'ne' dazu schreibe wird wieder getriggert, aber dann kommt auch wieder der Absturz des Adapters.
Wir haben also zwei Baustellen:
a) Wie triggert man richtig (also nur wenn die Variable auf 2 geht) val:2 alleine geht nicht und val:2 mit change geht auch nicht. Nur change alleine scheint zu funktionieren oder eben ganz one change und val. Dann loopt der Mist aber sogar ohne Änderung der Varable
Kannst Du vielleicht kurz erläutern wie die on Syntax eigentlch funktioneren soll? Also was bewirken change und val genau und in kombination?
b) Der Absturz des Adapters sobald er was sagen soll. Interessanterweise aber nur bei dieser Sysvariablen…
Gruss Ralf