@alex_46 glückwunsch, du hast es tatsächlich hinbekommen 
Die Auswertung ist relativ kompliziert ich mach das mit einem Java Skript
Ich poste das Skript hier einfach mal. Bitte entschuldige das ein bisschen Kraut und Rüben ist, aber es ist nur für mich, die Arbeitsversion quasi. Das Thema ist ja sehr speziell und es gibt nicht so viele, die sich dafür interessieren, darum habe ich da nicht so viel Mühe investiert.
Das wichtigste:
Die Elster Definitiondatei muss an dem entsprechenden Pfad in deiner IOBroker Installation liegen und es müssen entsprechende Zugriffsrechte auf diese Datei (lesend) existieren.
Einige Werte werden ja automatisch in regelmäßigen Abständen übertragen.
Für alle anderen solltest du einmal die Funktion scanAllElsterIds mit der richtigen Geräte ID durchlaufen lassen und danach wieder aus kommentieren.
Viel Erfolg bei der Umsetzung! Bei mir läuft das seit der ersten in Betriebname ohne irgendwelche Probleme. Schätze, seit einem halben Jahr.
ElsterTable.inc
const DEBUG = false
let filePath = '/opt/iobroker/iobroker-data/ElsterTable.inc';
let elsterJsObject = convertToJsObject(filePath);
//const CanScnifferId = "mqtt.0.cansniffer"
const CanScnifferId = "mqtt.0.cansniffer2.142"
let scanAllElsterIdsTimerVar, scanAllStatestimerVar, scanShortStatestimerVar
let GlobscanAllElsterIds = {
lastPosition: 0,
lastkey: "0",
//geraet: 0x0180
}
// Das muss einmal pro Zieladresse ausgeführt werden um zu scannen welche Datenpunke abfragbar sind
// Jeweils einmall pro Adresse
// scanAllElsterIds(0x301,0)
let GlobscanAllStates = {
lastPosition: 0,
lastkey: "0",
intervall: 10 * 60 * 1000,
}
scanAllStates()
// Die Hier angegebenen Datenpunkte werden in einem unter Intervall angegebenen Intervall in Millisekunden regelmäßig aktiv abgefragt
let GlobshortScan = {
lastPosition: 0,
lastkey: "0",
intervall: 30000,
iDs: [
{ geraet: 0x0180, elsterName: "WPVORLAUFIST" },
{ geraet: 0x0180, elsterName: "RUECKLAUFISTTEMP" },
{ geraet: 0x0180, elsterName: "MASCHINENDRUCK" },
{ geraet: 0x0301, elsterName: "VORLAUFSOLLTEMP" },
{ geraet: 0x0180, elsterName: "PUFFERSOLL" },
]
}
scanShortStates()
on({ id: CanScnifferId + '.pload', change: "ne" }, function (obj) {
//if (DEBUG || false) log(obj.state.val)
const telegramObj = parseCanTelegram(JSON.parse(obj.state.val))
if (Number(telegramObj.elsterIndex) == Number(GlobscanAllElsterIds.lastkey)) {
//log("gleich")
//log(Number(telegramObj.elsterIndex) + " - " + Number(GlobscanAllElsterIds.lastkey))
clearTimeout(scanAllElsterIdsTimerVar)
scanAllElsterIds(GlobscanAllElsterIds.geraet, GlobscanAllElsterIds.lastPosition + 1)
}
if (Number(telegramObj.elsterIndex) == Number(GlobscanAllStates.lastkey)) {
//log("gleich")
//log(Number(telegramObj.elsterIndex) + " - " + Number(GlobscanAllElsterIds.lastkey))
clearTimeout(scanAllStatestimerVar)
scanAllStates(GlobscanAllStates.lastPosition + 1)
}
if (Number(telegramObj.elsterIndex) == Number(GlobshortScan.lastkey)) {
//log("gleich")
//log(Number(telegramObj.elsterIndex) + " - " + Number(GlobscanAllElsterIds.lastkey))
clearTimeout(scanShortStatestimerVar)
scanShortStates(GlobshortScan.lastPosition + 1)
}
//evaluateMessages(JSON.parse(obj.state.val))
//log(JSON.stringify(telegramObj));
//writeLog(JSON.stringify(telegramObj)), 'CanLog.csv').catch(error => console.error(JSON.stringify(error)));
});
function convertToJsObject(filePath) {
// In einer echten JavaScript-Umgebung müsste hier die fs-Bibliothek verwendet werden,
// um die Datei zu lesen. Der folgende Code ist eine vereinfachte Darstellung.
const fs = require('fs');
let elsterTable = {};
// Lies die Datei synchron, dies ist in einem realen Szenario zu vermeiden
let fileContent = fs.readFileSync(filePath, 'utf-8');
let lines = fileContent.split('\n');
lines.forEach((line) => {
// Ignorieren von Kommentaren und leeren Zeilen
if (line.startsWith('//') || line.trim() === '' || line.startsWith('{') || line.startsWith('}')) {
return;
}
// Entfernen von Anführungszeichen und geschweiften Klammern, dann Aufspaltung der Zeile in Teile
let parts = line.replace('{', '').replace('}', '').replace(/"/g, '').trim().split(',');
parts = parts.map(part => part.trim()).filter(part => part);
// Überprüfen, ob die Zeile drei Teile enthält: Name, Index und Typ
if (parts.length === 3) {
let [name, index, type_] = parts;
try {
// Versuche, den Index von Hex zu Dezimal zu konvertieren
let indexKey = parseInt(index, 16);
// Hinzufügen zum JavaScript-Objekt
elsterTable[indexKey] = { "name": name, "type": type_ };
} catch (error) {
// Wenn der Index nicht in einen Integer umgewandelt werden kann, ignorieren wir diese Zeile
console.error('Konvertierungsfehler:', error);
}
}
});
return elsterTable;
}
// Das ElsterTable-Objekt, das zuvor erstellt wurde
let elsterTable = elsterJsObject
// Funktion zum Konvertieren der Hex-Daten in lesbare Werte
function convertData(hexString) {
let bytes = [];
for (let i = 0; i < hexString.length; i += 2) {
bytes.push(parseInt(hexString.substr(i, 2), 16));
}
let rawValue = (bytes[1] << 8) | bytes[2]; // Korrigierte Byte-Position
return rawValue / 10; // Annahme: Der Wert ist durch 10 zu teilen
}
// Funktion zum Auswerten der Nachrichten
function evaluateMessages(message) {
//messages.forEach((message) => {
let id = message.ID;
let data = message.Data.replace(/\s/g, "");
// Der Index ist das dritte Byte in der Nachricht, hier als Hex-String
let indexHex = data.substr(4, 2);
log(indexHex)
let index = parseInt(indexHex, 16);
let valueHEX = data.substr(6, 4);
let value = parseInt(valueHEX, 16)
log("Index:" + index)
log("Data:" + data)
log("Value Hex:" + valueHEX)
log("Value Dezi:" + value)
// Hole den Eintrag aus dem ElsterTable
let entry = elsterTable[index];
if (entry) {
log(`Gerät: ${id}, Parameter: ${entry.name}, Wert: ${value / 10}`);
} else {
log(`Unbekannter Index: ${indexHex}. Message: ${message}`);
}
}
function parseMessage(str) {
// Zerlege den String in Teile und extrahiere relevante Teile
const parts = str.trim().split(/\s+/);
const idPart = parts[1].substring(2); // Entferne '0x'
const dataPart = parts.slice(4).join('').replace("Data:", ""); // Entferne 'Data:'
// Erstelle das messages-Objekt
return {
id: idPart, // Entfernt '0x'
data: dataPart // Entfernt 'Data:'
};
}
// Beispiel für die Verwendung der Funktion
//const messageStr = {"ID": "0x301", "Len": "7", "Data": "C0 01 11 00 DF 00 00"};
//evaluateMessages(messageStr)
// ****************************************************************
// :
function parseCanTelegram(telegram) {
// Entferne alle Leerzeichen und prüfe das Format
let dataString = telegram.Data.replace(/\s/g, '');
if (dataString.length % 2 !== 0) {
throw new Error('Ungültige Datenlänge');
}
// Zerlege die Daten in ihre Teile
let parts = dataString.match(/.{1,2}/g).map(byte => parseInt(byte, 16));
// Berechne die CAN-ID
let calculatedId = (8 * (parts[0] & 0xF0)) + (parts[1] & 0x0F);
let calculatedIdHex = calculatedId.toString(16).toUpperCase();
calculatedIdHex = "0x" + ("000" + calculatedIdHex).slice(-4);
// Überprüfe den Typ des Telegramms
let typID = (parts[0] & 0x0F)
let type
switch (typID) {
case 0:
type = "write"
break;
case 1:
type = "read"
break;
case 2:
type = "response"
break;
case 3:
type = "ack"
break;
case 4:
type = "write ack"
break;
case 5:
type = "write respond"
break;
case 6:
type = "system"
break;
case 7:
type = "system respond"
break;
default:
type = "Unbekannt"
}
// Bestimme den Elster-Index und erhöhe ihn um 1
let elsterIndex = parts[2] === 0xFA ? (((parts[3] << 8) + parts[4])) : (parts[2]);
// Konvertiere den Elster-Index in vierstellige Hexadezimalzahl und entferne das zuvor hinzugefügte +1
let elsterIndexHex = elsterIndex.toString(16).toUpperCase();
let elsterFunktion = elsterTable[elsterIndex];
elsterIndexHex = "0x" + ("000" + elsterIndexHex).slice(-4);
let data = parts.slice(3).map(byte => byte.toString(16).padStart(2, '0')).join(' ').toUpperCase();
// Nutzdaten, beginnend nach dem Elster-Index
let dataIndexStart = parts[2] === 0xFA ? 5 : 3;
let dataBytes = parts.slice(dataIndexStart, dataIndexStart + 2);
let dataHex = dataBytes.map(byte => byte.toString(16).padStart(2, '0')).join('').toUpperCase();
let dataDecimal = (dataBytes[0] << 8) + dataBytes[1];
let dataDecimalCon = AllValuesConverter(dataDecimal, elsterFunktion.type, true)
let StateToSet = "0_userdata.0.WP13." + telegram.ID.replace("0x", "") + "." + elsterFunktion.name
//log(StateToSet)
//log("state:" + StateToSet + " dataDecimalCon: " + dataDecimalCon)
if (dataDecimal != 32768) {
createState(StateToSet, dataDecimalCon, false)
setState(StateToSet, dataDecimalCon, true)
}
return {
raw: dataString,
calculatedId: calculatedIdHex,
type,
elsterIndex: elsterIndexHex,
elsterFunktion,
dataHex,
dataDecimal,
FromID: telegram.ID,
Len: telegram.Len
};
}
function AllValuesConverter(value, TypeString, read = true) {
//log("value to String: " + value.toString().toLowerCase() )
switch (TypeString) {
case "et_datum":
if (read) {
return convertBytesToDatum(Number(value))
} else {
return convertDatumToBytes(value)
}
break;
case "et_dec_val":
if (read) {
return Number((interpretAsSigned16(value) / 10).toFixed(1))
} else {
return Number((interpretAsSigned16(value) * 10).toFixed(0))
}
break;
case "et_time_domain":
if (read) {
if (value == 0xFFFF) return "NA"
if (value == 0x8080) return "-----"
return convertBytesToTime(Number(value))
} else {
if (value.toString() == "NA") return 0xFFFF
if (value.toString() == "-----") return 0x8080
log("Zeitrückgabe: " + value + " zu: " + Number(convertTimeRangeToBytes(value.toString())))
return Number(convertTimeRangeToBytes(value.toString()))
}
break;
case "et_betriebsart":
if (read) {
if (value == 0x0000) return "Notbetrieb"
if (value == 0x0100) return "Bereitschaft"
if (value == 0x0200) return "Automatik"
if (value == 0x0300) return "Tagbetrieb"
if (value == 0x0400) return "Absenkbetrieb"
if (value == 0x0500) return "Warmwasser"
if (value == 0x0B00) return "FEKAuto"
return value
} else {
//log("value to String: " + value.toString().toLowerCase() )
if (value.toString().toLowerCase() == "notbetrieb") return 0x0000
if (value.toString().toLowerCase() == "bereitschaft") return 0x0100
if (value.toString().toLowerCase() == "automatik") return 0x0200
if (value.toString().toLowerCase() == "tagbetrieb") return 0x0300
if (value.toString().toLowerCase() == "absenkbetrieb") return 0x0400
if (value.toString().toLowerCase() == "warmwasser") return 0x0500
if (value.toString().toLowerCase() == "fekauto") return 0x0B00
return Number(value)
}
break;
case "et_little_endian":
case "et_little_bool":
return littleEndianHexConvert(value)
break;
default:
return value
}
}
function interpretAsSigned16(uint16) {
// Prüfen, ob die Zahl größer als der maximal positive Wert für einen vorzeichenbehafteten 16-Bit-Integer ist
if (uint16 > 32767) {
return uint16 - 65536;
} else {
return uint16;
}
}
// Von Little Endian Hex zu Dezimal
function littleEndianHexConvert(value) {
// Verschieben Sie die Bytes und kombinieren Sie sie
let lowByte = value & 0xFF; // Extrahieren Sie das niedrigwertige Byte
let highByte = (value & 0xFF00) >> 8; // Extrahieren und verschieben Sie das hochwertige Byte
return (highByte | (lowByte << 8));
}
function convertBytesToTime(value) {
let startByte = value >> 8;
let endByte = value & 0xFF;
return convertToTime(startByte) + ' - ' + convertToTime(endByte);
}
function convertBytesToDatum(value) {
let startByte = value >> 8;
let endByte = value & 0xFF;
return (startByte) + '.' + (endByte);
}
function convertToTime(value) {
let hours = Math.floor(value / 4);
let minutes = (value % 4) * 15;
return hours.toString().padStart(2, '0') + ':' + minutes.toString().padStart(2, '0');
}
function convertTimeToBytes(startTime, endTime) {
let startUnits = convertToUnits(startTime);
let endUnits = convertToUnits(endTime);
return (startUnits << 8) + endUnits;
}
function convertToUnits(time) {
let [hours, minutes] = time.split(':').map(Number);
return hours * 4 + Math.floor(minutes / 15);
}
function convertTimeRangeToBytes(timeRange) {
// Entfernen Sie alle Leerzeichen aus dem String
let cleanedTimeRange = timeRange.replace(/\s/g, '');
// Teilen Sie den bereinigten String in Start- und Endzeit
let [startTime, endTime] = cleanedTimeRange.split('-');
if (!endTime) return timeRange
return convertTimeToBytes(startTime, endTime);
}
function convertDatumToBytes(datum) {
let cleaneddatum = datum.replace(/\s/g, '');
let [tag, monat] = cleaneddatum.split('.').map(Number);
//log(tag + " " + monat + " " + typeof(monat))
if (!monat) return datum
return ((tag << 8) + (monat));
}
//console.log(convertBytesToTime(0x8080)); // Gibt "00:00 - 01:15" aus
//console.log(convertTimeToBytes("15:30", "01:15").toString(16)); // Gibt "105" aus
//console.log(convertTimeRangeToBytes("32:00 - 32:00").toString(16)); // Gibt "105" aus
//log(convertBytesToDatum(3851)) // Gibt "15.11" aus
//log(convertDatumToBytes("15.11"))
// Beispiel-Telegramm
let telegram = {
"ID": "0x680",
"Len": "6",
"Data": "61010112340000"
}
//console.log(parseCanTelegram(telegram));
function buildCanIdWithTypeId(canId, typeId, elsterIndexHex, HexDaten) {
let hexbuffer = Buffer.from("0000000000", "hex")
hexbuffer[0] = Math.floor(parseInt(canId, 16) / 8) + parseInt(typeId, 16)
hexbuffer[1] = (parseInt(canId, 16) % 8)
let elsterBytes = Buffer.from(elsterIndexHex, "hex");
hexbuffer[2] = elsterBytes[1];
//hexbuffer[3] = elsterBytes[1];
let DatenBytes = Buffer.from(HexDaten, "hex");
hexbuffer[3] = DatenBytes[0];
hexbuffer[4] = DatenBytes[1];
return hexbuffer.toString('hex')
}
/***************************************
********** LOG FILE ERSTELLEN ************
****************************************/
const logpath = '/opt/iobroker/log/';
const fs = require('fs').promises;
async function writeLog(logEntry, filename = "ECOTest2.csv") {
// Get the current date and time
const now = new Date();
const dateTime = now.toLocaleString();
// Format the log entry
const formattedEntry = `${dateTime}\t${logEntry}\n`;
try {
// Check if the file already exists
await fs.stat(logpath + filename);
} catch (error) {
if (error.code === 'ENOENT') {
// If the file does not exist, we need to add the header
const header = 'DateTime\tLog Entry\n';
await fs.writeFile(logpath + filename, header);
log("neue datei erstellt");
} else {
// Some other error occurred
throw error;
}
}
// Append the log entry to the file
try {
await fs.appendFile(logpath + filename, formattedEntry);
//console.log('Log entry saved!');
} catch (error) {
throw error;
}
}
// Anwendung:
//writeLog('This is a test entry.', 'Filename.csv').catch(error => console.error(error));
//***************************************
//***************************************
function initElsterFrame(senderId, receiverId, elsterIdx, pdaten, typ = 1) {
senderId = Number(senderId)
const address = (Number(receiverId) & 0x780) >> 3;
let data = new Array(7); // Erstellt ein Array mit 5 Elementen für die Datenbytes
// Die Id und die Länge des Frames werden nicht direkt gesetzt, da in JavaScript
// üblicherweise Objekte anstelle von direkt manipulierten Byte-Arrays verwendet werden.
data[0] = (Number(address) & 0xF0) + Number(typ);
data[1] = Number(receiverId) & 0x07;
data[2] = 0xFA;
data[3] = (Number(elsterIdx) >> 8) & 0xFF; // Höherwertiges Byte von ElsterIdx
data[4] = Number(elsterIdx) & 0xFF; // Niederwertiges Byte von ElsterIdx
data[5] = (Number(pdaten) >> 8) & 0xFF; // Niederwertiges Byte von ElsterIdx
data[6] = Number(pdaten) & 0xFF; // Niederwertiges Byte von ElsterIdx
return {
ID: "0x" + senderId.toString(16),
Len: "7",
Data: data.map(byte => byte.toString(16).padStart(2, '0')).join('').toUpperCase()
};
}
// Änderungen senden:
on({ id: new RegExp("0_userdata.0.WP13\..*"), change: "any", ack: false }, function (obj) {
log("was geändert:" + obj.id + " ack:" + obj.state.ack)
readDataFromObject(obj, 'write')
});
function readDataFromObject(obj, art = 'readonly') {
let ID, elstername, mtelegram
if (obj.id) {
ID = "0x" + ((obj.id).split('.').slice(-2, -1)[0])
elstername = ((obj.id).split('.').slice(-1)[0])
} else {
ID = "0x" + ((obj._id).split('.').slice(-2, -1)[0])
elstername = ((obj._id).split('.').slice(-1)[0])
}
let elsterObjekt = Object.entries(elsterJsObject).find(([key, value]) => value.name === elstername);
let elsterID = elsterObjekt[0]; // Der Schlüssel
let gesuchtesObjekt = elsterObjekt[1]; // Das gesuchte Objekt
// Verwenden Sie hier elsterID und gesuchtesObjekt wie benötigt
// log (JSON.stringify(gesuchtesObjekt) + " : " + obj.state.val + " Konvertiert: " + AllValuesConverter(obj.state.val, gesuchtesObjekt.type ,true))
//let elsterID = Object.keys(elsterJsObject).find(key => elsterJsObject[key].name === elstername);
/*
log("Gerät: " + ID)
log("elstername: " + elstername)
log("elsterIDHex: " + Number(elsterID).toString(16))
log("value: " + obj.state.val)
log("art: " + art)
*/
if (art == 'write') {
let dataDecimalCon = AllValuesConverter((obj.state.val), gesuchtesObjekt.type, false)
mtelegram = JSON.stringify(initElsterFrame("0x680", ID, elsterID, dataDecimalCon, 2))
log(" Wert Setzten: " + mtelegram)
setState(CanScnifferId + '.canSend', mtelegram)
setTimeout(function () {
mtelegram = JSON.stringify(initElsterFrame("0x680", ID, elsterID, 0, 1))
//log(" Wert abrufen: " + mtelegram)
setState(CanScnifferId + '.canSend', mtelegram)
}, 2 * 1000);
} else if (art == 'readonly') {
mtelegram = JSON.stringify(initElsterFrame("0x680", ID, elsterID, 0, 1))
//log(" Wert abrufen: " + mtelegram)
setState(CanScnifferId + '.canSend', mtelegram)
}
}
//Zum Scannen aller verfügbaren Parameter eines gerätes
function scanAllElsterIds(geraet = 0x180, lastPosition = 0) {
GlobscanAllElsterIds.geraet = geraet
let canId, mtelegram
let maxScan
let keys = Object.keys(elsterJsObject);
maxScan = keys.length
if (lastPosition >= maxScan) {
let Zeitkompl = Math.floor((Date.now() - GlobscanAllStates.Starttime) / 1000)
if (DEBUG) log("Scan all ElsterIds beendet. Scandauer: " + Zeitkompl + " Sekunden für " + lastPosition + " Scans")
GlobscanAllElsterIds.lastPosition = 0
GlobscanAllElsterIds.lastkey = "0"
GlobscanAllElsterIds.Starttime = 0
return
} else if (lastPosition == 0) {
if (DEBUG) log("Scan all States gestartet")
GlobscanAllElsterIds.Starttime = Date.now()
}
let key = keys[lastPosition]
if (DEBUG) if (lastPosition % 20 == 0) log("(" + ((100 / maxScan) * lastPosition).toFixed(0) + "%) Scanposition: " + lastPosition + " von " + maxScan + " elsterID:" + key + " elstername:" + elsterJsObject[key].name)
//log(key)
mtelegram = JSON.stringify(initElsterFrame("0x680", geraet, key, 0, 1))
//log(lastPosition + " von " + maxScan + " Wert abrufen: " + mtelegram)
setState(CanScnifferId + '.canSend', mtelegram)
GlobscanAllElsterIds.lastPosition = lastPosition
GlobscanAllElsterIds.lastkey = key
scanAllElsterIdsTimerVar = setTimeout(function () {
scanAllElsterIds(geraet, lastPosition + 1); // Setzt den nächsten Aufruf auf 1000 ms später
}, 5000)
}
//Zum Scannen aller Angelegten States
function scanAllStates(lastPosition = 0) {
let mSelector = $("0_userdata.0.WP13.*");
let maxScan = mSelector.length
if (lastPosition >= maxScan - 1) {
let Zeitkompl = Math.floor((Date.now() - GlobscanAllStates.Starttime) / 1000)
if (DEBUG) log("Scan all States beendet. Scandauer: " + Zeitkompl + " Sekunden für " + lastPosition + " Scans")
GlobscanAllStates.lastPosition = 0
GlobscanAllStates.lastkey = "0"
GlobscanAllStates.Starttime = 0
setTimeout(function () {
scanAllStates(0); // Setzt den nächsten Aufruf auf 1000 ms später
}, GlobscanAllStates.intervall)
return
} else if (lastPosition == 0) {
if (DEBUG) log("Scan all States gestartet")
GlobscanAllStates.Starttime = Date.now()
}
//log("mSelector " + mSelector[lastPosition])
let elstername = ((mSelector[lastPosition]).split('.').slice(-1)[0])
let geraeteId = (mSelector[lastPosition]).split('.').slice(-2)[0]
//log("GeraeteID:" + geraeteId )
let elsterID = Object.keys(elsterJsObject).find(key => elsterJsObject[key].name === elstername);
GlobscanAllStates.lastPosition = lastPosition
GlobscanAllStates.lastkey = elsterID
if (DEBUG) if (lastPosition % 20 == 0) log("ScanAllStates (" + ((100 / maxScan) * lastPosition).toFixed(0) + "%) Positiom:" + lastPosition + " von " + maxScan + " geraeteId:" + geraeteId + " elsterID:" + elsterID + " elstername:" + elstername)
let myObj = getObject(mSelector[lastPosition])
myObj.state = getState(mSelector[lastPosition])
myObj.id = mSelector[lastPosition]
//log(JSON.stringify(myObj))
readDataFromObject(myObj)
scanAllStatestimerVar = setTimeout(function () {
if (elstername != "DATUM") log("Timeout position:" + lastPosition + " geraeteId:" + geraeteId + " elsterID:" + elsterID + " elstername:" + elstername)
scanAllStates(lastPosition + 1); // Setzt den nächsten Aufruf auf 1000 ms später
}, 5000)
}
function scanShortStates(lastPosition = 0) {
let maxScan = GlobshortScan.iDs.length
//log("Anzahl IDs Short:" + maxScan)
if (lastPosition >= maxScan) {
let Zeitkompl = Math.floor((Date.now() - GlobshortScan.Starttime) / 1000)
if (DEBUG) log("Scan Short States beendet. Scandauer: " + Zeitkompl + " Sekunden für " + lastPosition + " Scans")
GlobshortScan.lastPosition = 0
GlobshortScan.lastkey = "0"
GlobshortScan.Starttime = 0
setTimeout(function () {
scanShortStates(0); // Setzt den nächsten Aufruf auf 1000 ms später
}, GlobshortScan.intervall)
return
} else if (lastPosition == 0) {
if (DEBUG) log("Scan Short States gestartet")
GlobshortScan.Starttime = Date.now()
}
//log("mSelector " + mSelector[lastPosition])
let elstername = GlobshortScan.iDs[lastPosition].elsterName
let elsterID = Object.keys(elsterJsObject).find(key => elsterJsObject[key].name === elstername);
GlobshortScan.lastPosition = lastPosition
GlobshortScan.lastkey = elsterID
let esterState = "0_userdata.0.WP13." + GlobshortScan.iDs[lastPosition].geraet.toString(16).replace("tzt0x", "") + "." + elstername
//log(esterState)
if (DEBUG) if (lastPosition % 20 == 0) log("ScanShortStates (" + ((100 / maxScan) * lastPosition).toFixed(0) + "%) Positiom:" + lastPosition + " von " + maxScan + " elsterID:" + elsterID + " elstername:" + elstername)
let myObj = getObject(esterState)
myObj.state = getState(esterState)
myObj.id = esterState
//log(JSON.stringify(myObj))
readDataFromObject(myObj)
scanShortStatestimerVar = setTimeout(function () {
log("Timeout Shortscan position:" + lastPosition + " elsterID:" + elsterID + " elstername:" + elstername)
scanShortStates(lastPosition + 1); // Setzt den nächsten Aufruf auf 1000 ms später
}, 5000)
}
/*
//Objekte löschen:
$('0_userdata.0.WP13.180.EL_*').each(function (id, i) {
log(i + " - " + id + " existsObject: " + existsObject(id))
//deleteObject(id,true);
});
*/
// Beispielaufruf
let canId, mtelegram
let Senderid = "0x680"
canId = "0x180"; // 384 in dezimal
//canId = "0x601"; // 384 in dezimal
let typeId = 1; // 1 in dezimal
let elsterIndexHex = "0x17a0"
let pHexDaten = 0x0000
mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
//console.log("Generiertes Telegramm:" + mtelegram);
//setState( CanScnifferId +'.canSend', mtelegram)
/*
setState( CanScnifferId +'.canSend', mtelegram, function () {
setTimeout(function () {
elsterIndexHex = "0x1700"
pHexDaten = 0x8080
mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
console.log("Generiertes Telegramm:" + mtelegram);
setState( CanScnifferId +'.canSend', mtelegram, function () {
setTimeout(function () {
elsterIndexHex = "0x1722"
pHexDaten = 0x8080
mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
console.log("Generiertes Telegramm:" + mtelegram);
setState( CanScnifferId +'.canSend', mtelegram)
}, 200);
})
}, 200);
})
*/
//console.log(mtelegram);
setTimeout(function () {
typeId = 1;
//elsterIndexHex = "0x1720"
//HexDaten = "0000"
mtelegram = JSON.stringify(initElsterFrame(Senderid, canId, elsterIndexHex, pHexDaten, typeId))
//console.log("Generiertes Telegramm:" + mtelegram);
//setState( CanScnifferId +'.canSend', mtelegram)
}, 2 * 1000);
//