So, habe nochmal ein wenig "rumgeforscht".
Anscheinend geht hier durch das asynchrone Verhalten von Node.js so einiges durcheinander. Die Versuche das durch "process.nextTick" oder "await" und "premises" hinzubekommen sind bei mir fehlgeschlagen. Ich habe aber einen Weg gefunden wie es zumindest bei mir jetzt funktioniert die Bilder Zeitgerecht und so abzulegen das ich mit VIS darauf zugreifen kann (auch wenn sie auf einer gemounteten FAT32 SD-Karte liegen).
Wenn ich das ganze asynchrone IO-Filehandling von Node.js richtig verstanden habe, sollte man in den Callback Funktionen das Filehandling einbauen. Denn nur dort ist sichergestellt das die File-Operation auch wirklich gelaufen ist. Wenn man das sequentiell im Quellcode schreibt kann es sein, dass, wegen der asynchronität von Node.js, sich Funktionen einander überholen.
Meine Lösung sieht nun so aus:
var KlingelBilder = ["","",""];
function saveImage() {
var time = new Date();
// Bildnamen erzeugen
var Name = 'Eing_'+time.getFullYear()+time.getMonth()+time.getDate()+'_'+time.getHours()+time.getMinutes()+time.getSeconds()+'.jpg';
request.get({url: cam_img, encoding: 'binary'}, function (err, response, body) {
if(err) {
log('Beim holen des Bildes ist ein Fehler aufgetreten!');
} else
{ fs.writeFile('/home/USB/bellpics/tmp.jpg', body, 'binary', function(err) {
if (err) {
log('Fehler beim Speichern von Bild /home/USB/bellpics/tmp.jpg Fehler:' + err, 'warn');
} else {
var data = fs.readFileSync('/home/USB/bellpics/tmp.jpg');
writeFile('vis.0', 'KameraBilder/' + Name, data, function (error) {
if(error) {
log('Fehler beim Speichern von Bild KameraBilder/' + Name +' Fehler:' + err, 'warn');
} else {
// Bilder durchrotieren. An position 0 steht immer das letzte Bild
log('Bild wurde als KameraBilder/' + Name +' gespeichert');
KlingelBilder[2] = KlingelBilder[1];
KlingelBilder[1] = KlingelBilder[0];
KlingelBilder[0] = '/vis.0/KameraBilder/' + Name;
setState('javascript.0.Sonderfunktionen.KlingelBild1', KlingelBilder[0]);
setState('javascript.0.Sonderfunktionen.KlingelBild2', KlingelBilder[1]);
setState('javascript.0.Sonderfunktionen.KlingelBild3', KlingelBilder[2]);
}
});
}
});
}
});
}
@Peoples
Ich habe auch die exec Funktion wieder gegen das request.get (Zeile 7) ausgetauscht weil ich ungerne die exec-Funktion im Javascript-Adapter freischalte.
Die Verzeichnisse kann man sich ja nach belieben anpassen....
Viele Grüße,
Artur