@UncleSam Hab mal so gelöst:
/*************************************************/
// Globale Funktion, um Alarme auf dem vis auszugeben, im NAS zu loggen und auf dem Mobile (tts) auszugeben
// Max 5 schnellfolgende Meldungen
/*************************************************/
var sLog = new Array(5);
var sTxt = new Array(5);
var sDauer = new Array(5);
var sInSay = new Array(5);
var iMeldungSpanne=3000; // 3 Sek pro Meldung
var LogenInVerzeichnis = "/home/pi/nas/history.csv"; // Text Datei auf NAS
var URLSoundAusgabe = "http://192.168.1.147:50000/tts="; // Mobile im Wohnzimmer
for (var i = 0; i < sLog.length; i++) {sLog[i] = "";} // Array sLog Initialisieren
var vIntervall=null; // k.A. ob es wirklich nötig ist
vIntervall=setInterval(function(){StringArrayAusgeben();}, iMeldungSpanne *5 + 200); // Endless loop, alle 15 Sekunden
// Max 5 Meldungen vom Array sLog mit Zeitspanne 3Sek ausgeben
// falls innert 15 sek > 5 Meldungen eintreffen, gehen die verloren
function HistoryAnlegen(InText, InDauerText, InSay){ // sLog[i] synchron befüllen
for (var i = 0; i < sLog.length; i++){
if(sLog[i]==""){
/***** Datum loggen, wenn es sich geändert hat ******/
var sLastHistoryDate=getState('0_userdata.0.Sicherheit.dLastHistoryDate').val;
var sCurrentDate=formatDate(new Date(), "<B>JJJJ.MM.TT</B>");
if (sCurrentDate != sLastHistoryDate){
setState('0_userdata.0.Sicherheit.dLastHistoryDate', sCurrentDate, true);
strTmp = sCurrentDate + "<br>";
}
/***** den Text 'Offen Seit..." ermitteln ******/
var strTmp=""
if (InDauerText + "" == ""){strTmp = strTmp + formatDate(new Date(), "<B> SS:mm</B>:ss") + " " + String(InText) + "<br>";}
else{
if(InDauerText>59){
InDauerText=(InDauerText/60).toFixed(1);
strTmp = strTmp + formatDate(new Date(), "<B> SS:mm</B>:ss") + " " + String(InText) + ", " + InDauerText + " Min. offen<br>";
}
else{
strTmp = strTmp + formatDate(new Date(), "<B> SS:mm</B>:ss") + " " + String(InText) + ", " + InDauerText + " Sek. offen<br>";
}
}
sLog[i]=strTmp;sTxt[i]=InText;sDauer[i]=InDauerText;sInSay[i]=InSay;break;
}
}
}
async function StringArrayAusgeben(){ // Wird alle 15 Sek einmal aufgerufen
for (var j = 0; j < 5; j++){
if(sLog[j]!="" ){
const result = await StringArrayAusgebenSub(sLog[j], sTxt[j], sDauer[j], sInSay[j], j);sLog[j]=""; // Alle 3 Sek eine Meldung ausgeben
}
}
}
function StringArrayAusgebenSub(InStrTimeStamp, InStr, InDauerText, InSay, InCounter){return new Promise(resolve => {setTimeout(() =>{ // Durchlauf: 3 Sek
/***** Alarme am Handy aussagen, false InSay=true ******/
if (InSay && getState('0_userdata.0.Sicherheit.bAlarmIstScharf').val){request(URLSoundAusgabe + InStr.toLowerCase());}
/***** Alarme in die LogDatei ergänzen ******/
wl(InStr, InDauerText);
/***** Alarme im Objekt sAlarmLogHistory ergänzen ******/
InStrTimeStamp = InStrTimeStamp + String(getState('0_userdata.0.Sicherheit.sAlarmLogHistory').val);
setState('0_userdata.0.Sicherheit.sAlarmLogHistory', InStrTimeStamp, false);
resolve('resolved');}, iMeldungSpanne);});
}
function wl(InText, InDauerText){
var fs = require('fs');
fs.appendFileSync(LogenInVerzeichnis, formatDate(new Date(), "DD.MM.YYYY") + ";" + formatDate(new Date(), "SS:mm:ss") + ";" + InText + ";" + InDauerText + "\n", 'utf8');
}
Die echten Programmer mögen meine Art der Codierung verzeihen. Doch, es tut, was es tun muss. Kann sicher optimiert werden. Vor allem, die anfängliche 15 Sek Warterei kriege ich nicht heraus.