NEWS
Frage zur Scriptprogrammierung
-
Hallo,
ich habe folgendes Script, was mir alle x-Stunden Werte per Telegram schicken soll (momentan zum Testen nur ein Wert).
Das Script funktioniert auch soweit, d.h. der Aufruf des Bash-Scriptes für Telegram geht, es wird jedoch die von mir gewünschte Variable (SendData1) nicht mitgeschickt sondern nur der Variablenname. Ich denke ich muß die Variable anders "verpacken" - bin aber mit meinen Programmierkünsten in Javascript noch nicht wirklich weit.
Zur Funktion: Ich rufe per exec das Script telegram.sh auf übergebe beim Aufruf die Priorität -2 und die Variable bzw. den Variableninhalt. Das Script sendet dann in Abhängigkeit der Prio den Variableninhalt an verschiedene Telegram Empfänger. Wie oben schon beschrieben geht das Senden es wird nur der Variableninhalt nicht mitgesendet sondern nur der Variablennname.
Kann mir einer von Euch einen Schubs in die richtige Richtung geben?
// Das Script soll alle x-Stunden Werte per Telegram versenden schedule('*/1 * * * *', function () { // Schedule zum testen auf 1 Minute var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val; log('Schedule wird ausgeführt'); // Logausgabe zum Testen // startet ein bash-script mit Sendeprio -2 Variableninhalt SendData1 soll gesendet werden exec('/opt/iobroker/scripts/telegram.sh -2 "SendData1"', function(err, stdout, stderr) { if (err) { log(stderr,'error'); } }); });
Gruß Steffen
-
Wie oben schon beschrieben geht das Senden es wird nur der Variableninhalt nicht mitgesendet sondern nur der Variablennname. `
Das liegt dran, dass den Variablennamen in die Anführungszeichen gepackst hast und nicht den Inhalt:exec('/opt/iobroker/scripts/telegram.sh -2 "SendData1"', function(err, stdout, stderr) {
muss lauten
exec('/opt/iobroker/scripts/telegram.sh -2 "' + SendData1 + '"', function(err, stdout, stderr) {
-
Hallo AlCalzone,
danke, das war´s - und ich muß noch viel lernen!
Gruß Steffen
-
Hmm, nun habe ich doch noch ein Problem…
... das Script ist nun soweit fertig, alle meine Variablen werden gesendet, ich würde nun gerne zwischen den einzelnen zu sendenden Variablen eine kurze Pause einfügen. Ich denke mit setTimeout könnte es was werden aber irgendwie habe ich noch einen Bock drinne, es wird nicht zeitversetzt versendet.
Edit: Habe das mit dem Schedule nun hinbekommen, hatte da noch einen Denkfehler drin.
Edit: Code in Code-Tags gepackt, das war mir glatt durchgegangen --> danke an pix
/** * Sendet zu bestimmten Zeiten Daten via Telegram */ schedule('0 6,12,18 * * *', function () { // Schedule für später mit Start alle 6h //schedule('*/1 * * * *', function () { // Schedule zum Testen auf 1 Minute setTimeout(Send2(), 500); setTimeout(Send3(), 1000); log('Script --> Info via Telegram alle 6h wird gestartet'); // Erste Variable senden var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val; exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Aussentemperatur beträgt ' + SendData1 + ' °C"', function(err, stdout, stderr) { if (err) { log(stderr,'error'); } }); // Zweite Variable senden function Send2() { var SendData2 = getState("javascript.0.Telegram.Garagentemperatur").val; exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Garagentemperatur beträgt ' + SendData2 + '"', function(err, stdout, stderr) { if (err) { log(stderr,'error'); } }); } // Dritte Variable senden function Send3() { var SendData3 = getState("javascript.0.Telegram.Füllstand_Zisterne").val; exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Der Zisternenfüllstand beträgt ' + SendData3 + '"', function(err, stdout, stderr) { if (err) { log(stderr,'error'); } }); } });
Gruß Steffen
-
Hmm, nun habe ich doch noch ein Problem…
... das Script ist nun soweit fertig, alle meine Variablen werden gesendet, ich würde nun gerne zwischen den einzelnen zu sendenden Variablen eine kurze Pause einfügen. Ich denke mit setTimeout könnte es was werden aber irgendwie habe ich noch einen Bock drinne, es wird nicht zeitversetzt versendet.
Edit: Habe das mit dem Schedule nun hinbekommen, hatte da noch einen Denkfehler drin.
` > /**
- Sendet zu bestimmten Zeiten Daten via Telegram
*/
schedule('0 6,12,18 * * *', function () { // Schedule für später mit Start alle 6h
//schedule('*/1 * * * *', function () { // Schedule zum Testen auf 1 Minute
setTimeout(Send2(), 500);
setTimeout(Send3(), 1000);
log('Script –> Info via Telegram alle 6h wird gestartet');
// Erste Variable senden
var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val;
exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Aussentemperatur beträgt ' + SendData1 + ' °C"', function(err, stdout, stderr) {
if (err) {
log(stderr,'error');
}
});
// Zweite Variable senden
function Send2() {
var SendData2 = getState("javascript.0.Telegram.Garagentemperatur").val;
exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Garagentemperatur beträgt ' + SendData2 + '"', function(err, stdout, stderr) {
if (err) {
log(stderr,'error');
}
});
}
// Dritte Variable senden
function Send3() {
var SendData3 = getState("javascript.0.Telegram.Füllstand_Zisterne").val;
exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Der Zisternenfüllstand beträgt ' + SendData3 + '"', function(err, stdout, stderr) {
if (err) {
log(stderr,'error');
}
});
}
}); `
Gruß Steffen `
Hallo,lass mal Klammer auf und zu in setTimeout weg und packe hier im Forum den Code in CODE-Tags und nicht in QUOTE-Tags.
Ausserdem habe ich mal die Abständezwischen den Sendungen auf 3s gestezt, damit man eine Verzögerung überhaupt bemerkt. Und schließlich ein paar Zeilen gespart: Wenn nach IF-Abfragen nur eine Code-Zeile ausgeführt wird, kann man die geschweifetn Klammern weglassen und den Befehl direkt dahinter setzen.
Geschweifte und normale Klammer zu für schedule hat noch gefehlt, denn am Ende des Skirptes sind die nicht korrekt. Die Funktionen sollten ausserhalb von schedule liegen.
! ````
! /**- Sendet zu bestimmten Zeiten Daten via Telegram
*/
! schedule('0 6,12,18 * * ', function () { // Schedule für später mit Start alle 6h
//schedule('/1 * * * *', function () { // Schedule zum Testen auf 1 Minute
setTimeout(Send2, 3000);
setTimeout(Send3, 6000);
log('Script --> Info via Telegram alle 6h wird gestartet');// Erste Variable senden var SendData1 = getState("javascript.0.eBus.Heizung.OutsideTemp").val; exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Aussentemperatur beträgt ' + SendData1 + ' °C"', function(err, stdout, stderr) { if (err) log(stderr,'error'); });
});
// Zweite Variable senden
function Send2() {
var SendData2 = getState("javascript.0.Telegram.Garagentemperatur").val;
exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Die Garagentemperatur beträgt ' + SendData2 + '"', function(err, stdout, stderr) {
if (err) log(stderr,'error');
});
}
// Dritte Variable senden
function Send3() {
var SendData3 = getState("javascript.0.Telegram.Füllstand_Zisterne").val;
exec('/opt/iobroker/scripts/telegram_neu.sh -2 "Der Zisternenfüllstand beträgt ' + SendData3 + '"', function(err, stdout, stderr) {
if (err) log(stderr,'error');
});
}! ````Gruß
Pix
-
Zur Erklärung:
setTimeout(Send2(), 500);
führt Send2 sofort aus (da runde Klammern dahinter) und versucht 500ms später den Rückgabewert von Send2() auszuführen.
setTimeout(Send2, 500);
weist setTimeout an, die Funktion Send2 nach 500ms auszuführen. Hier wird die Funktion selbst als Parameter übergeben (keine runden Klammern hinter Send2) und nicht ihr Rückgabewert.
-
Hallo pix und AlCalzone,
danke für Eure Erklärungen, hat prima funktioniert!
@Pix: Das die Funktionen außerhalb des Schedule liegen sollten habe ich gestern Abend noch rausgefunden, aber da waren die Finger dann irgendwann zu lahm zum tippen und kein Kaffee mehr in der Nähe :lol:
Danke nochmals Euch beiden
Gruß Steffen