Ich habe ab chatgpt wieder ein wenig gequält.
Es geht um die Abfrage der Buttons bei den schwarzen Displays.
Diese meine ich
https://github.com/OpenEPaperLink/OpenEPaperLink/wiki/2.9″-EL029H3WRA
Hier das Skript
// HIER DIE IP ADRESSE VOM OEPL ACCESS POINT EINTRAGEN
const serverIP = '192.168.49.185'; // z.B. 192.168.1.71
//Im Skript müssen noch zwei weiter Einträge event. der eigenen Umgebung angepasst werden
// Zeile 17 - "Datenpunkt zur Steuerung des Skripts"
// Zeile 21 - "Datenordner der empfangenen TAGs"
// Zeile 176 - "Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen"
// AB HIER NICHTS MEHR ÄNDERN!
const WebSocket = require('ws');
const http = require('http');
const wsUrl = `ws://${serverIP}/ws`; // WebSocket-URL
let ws;
let pingInterval;
let scriptStopping = false; // Flag, um zu prüfen, ob das Skript gestoppt wird
const controlState = '0_userdata.0.Tag_Buttons.Button_Skript_Steuerung.Button_Tags_Erdgeschoss'; // Datenpunkt zur Steuerung des Skripts
function ensureOpenEPaperLinkFolderExists(callback) {
const OpenEPaperLinkFolderPath = '0_userdata.0.Tag_Buttons.Erdgeschoss'; // Datenordner der empfangenen TAGs
getObject(OpenEPaperLinkFolderPath, (err, obj) => {
if (err || !obj) {
setObject(OpenEPaperLinkFolderPath, {
type: 'channel',
common: { name: 'Open E-Paper Link' },
native: {}
}, callback);
} else {
callback();
}
});
}
function ensureChannelExists(path, alias, callback) {
getObject(path, (err, obj) => {
if (err || !obj) {
setObject(path, {
type: 'channel',
common: { name: alias || 'Unbekanntes Gerät' },
native: {}
}, callback);
} else if (obj.common.name !== alias) {
extendObject(path, { common: { name: alias } }, callback);
} else {
callback();
}
});
}
function createStateAndSet(statePath, value) {
setObject(statePath, {
type: 'state',
common: {
name: statePath.split('.').pop(),
type: 'string',
role: 'value',
read: true,
write: true
},
native: {}
}, (err) => {
if (!err) {
setState(statePath, String(value), true);
}
});
}
function updateStateIfChanged(statePath, value) {
getState(statePath, (err, state) => {
if (err || !state) {
createStateAndSet(statePath, String(value));
} else if (state.val !== String(value)) {
setState(statePath, String(value), true);
}
});
}
function fetchDimensions(hwType, callback) {
const hwTypeHex = hwType.toString(16).padStart(2, '0').toUpperCase(); // Convert hwType to two-digit uppercase hexadecimal
const url = `http://${serverIP}/tagtypes/${hwTypeHex}.json`;
http.get(url, (res) => {
let data = '';
res.on('data', (chunk) => data += chunk);
res.on('end', () => {
if (res.statusCode === 200) {
try {
const dimensions = JSON.parse(data);
callback(null, dimensions);
} catch (e) {
callback(`Error parsing JSON from ${url}: ${e}`);
}
} else {
callback(`HTTP Error ${res.statusCode} from ${url}`);
}
});
}).on('error', (err) => {
callback(`Error fetching ${url}: ${err.message}`);
});
}
function handleHWType(basePath, hwType) {
createStateAndSet(`${basePath}.hwType`, String(hwType)); // Save hwType as a state
fetchDimensions(hwType, (err, dimensions) => {
if (!err && dimensions) {
createStateAndSet(`${basePath}.height`, String(dimensions.height));
createStateAndSet(`${basePath}.width`, String(dimensions.width));
createStateAndSet(`${basePath}.name`, String(dimensions.name));
if (dimensions.colors) {
createStateAndSet(`${basePath}.colors`, String(dimensions.colors));
}
if (dimensions.colortable) {
createStateAndSet(`${basePath}.colortable`, JSON.stringify(dimensions.colortable));
}
} else {
console.error(`Failed to fetch or set dimensions for hwType ${hwType}: ${err}`);
}
});
}
function connectWebSocket() {
if (scriptStopping) {
return; // Wenn das Skript gestoppt wird, keine Verbindung mehr herstellen
}
ws = new WebSocket(wsUrl);
ws.on('open', function open() {
console.log('Verbunden mit WebSocket');
startHeartbeat();
});
ws.on('message', function incoming(data) {
console.log('Daten empfangen:', data);
if (data) {
try {
let parsedData = JSON.parse(data);
console.log('Verarbeitete Daten:', JSON.stringify(parsedData, null, 2));
handleData(parsedData);
} catch (err) {
console.error('Fehler bei der Verarbeitung der Daten:', err);
}
} else {
console.log('Keine Daten oder leere Nachricht empfangen');
}
});
ws.on('close', function close() {
if (!scriptStopping) {
console.log('WebSocket-Verbindung geschlossen, versuche neu zu verbinden...');
clearInterval(pingInterval);
setTimeout(connectWebSocket, 5000);
}
});
ws.on('error', function error(err) {
console.error('WebSocket-Fehler:', err);
});
}
function startHeartbeat() {
pingInterval = setInterval(() => {
if (ws.readyState === WebSocket.OPEN) {
ws.ping(() => console.log('Ping sent'));
}
}, 10000); // Send ping every 10 seconds
ws.on('pong', () => {
console.log('Pong received');
});
}
function handleData(parsedData) {
if (parsedData.tags && Array.isArray(parsedData.tags)) {
parsedData.tags.forEach(tag => {
let basePath = `0_userdata.0.Tag_Buttons.Erdgeschoss.${tag.mac.replace(/:/g, '')}`; //Diesen Eintrag auch noch entsprechend der eigenen Umgebung anpassen
ensureChannelExists(basePath, tag.alias, () => {
Object.keys(tag).forEach(key => {
let statePath = `${basePath}.${key}`;
let value = tag[key];
updateStateIfChanged(statePath, value);
if (key === 'hwType') {
handleHWType(basePath, tag.hwType);
}
});
});
});
}
}
function disconnectWebSocket() {
if (ws) {
ws.close();
ws = null;
}
clearInterval(pingInterval);
}
// Skript-Start und -Stopp basierend auf einem Datenpunkt steuern
function setupScriptControl() {
setObject(controlState, {
type: 'state',
common: {
name: 'EPaper Script Control',
type: 'boolean',
role: 'switch',
read: true,
write: true,
def: false
},
native: {}
});
on({id: controlState, change: 'ne'}, (obj) => {
const state = obj.state.val;
if (state) {
// Skript starten
scriptStopping = false;
ensureOpenEPaperLinkFolderExists(connectWebSocket);
} else {
// Skript stoppen
scriptStopping = true;
disconnectWebSocket();
console.log('Skript beendet durch Steuer-Datenpunkt');
}
});
}
// Initiale Einrichtung
setupScriptControl();
Jetzt kann das Skript durch Setzen des Datenpunkts 0_userdata.0.ScriptControl.EPaperScript auf true oder false gestartet und gestoppt werden.
Bei mir funktioniert es.
Bitte die Einstellung im Skript beachten !!!
Die Fehlermeldungen bei dem ersten Durchlauf sind wohl normal.