NEWS
[Frage] schedule('*/1 * * * *',?????); # eBus_read-f (Einzelwert)
-
//–----------------------------------------------------------------------
// --- Quelle = http://forum.iobroker.net/viewtopic.php ... 205#p42405
// --- Autor = Hoich
// -----------------------------------------------------------------------
Habe das Script etwas angepasst:
! ````
// =============================================================================
// Auslesen von Einzelwerten vom eBusd
// =============================================================================
var root = 'eBus'; // root of state inside 'javascript.0'
var host = 'RPi2-2'; // set to your host running ebusd
var port = 8888; // default ebusd port
var logging = true; // fales wenn nicht gewünscht
var net = require('net'); //
var element = 'StorageTemp';
// ebusctl read -f StorageTemp
// 51.19;ok
// =============================================================================
var req = 'read -f ' + element;
var pfad = 'eBus.'+ element; // Pfad innerhalb der Instanz
// =============================================================================
// Datenpunkte anlegen
// =============================================================================
createState(pfad, 0, {name: 'eBus.' + element ,desc: 'Aktuelle Temperatur des Warmstartspeichers',rolle: 'value.temperature' ,type: 'string',unit: '°C'});
! // ---------------------------------------------------------- Start
if (logging) log('1. Start trying eBus abfrage');
var client = new net.Socket();
client.connect(port, host, function() {
if (logging) log('2. Connected to ebusd on ' + host + ':' + port);
client.write(req + '\n');
if (logging) log('3. TX-Befehl: "' + req + '" wird gesendet');
});
! // =============================================================================
// Funktion Daten abfragen
// =============================================================================
function parse(data) {
var arr = data.toString().split(/\r?;/); // wie viele Werte werden durch ";" getrennt
if (logging) log("Menge : " + arr.length);
var fields = data.toString().split(';'); // hier wird auf den = getriggert
if (logging) log('Felder : ' + fields);
if(fields.length > 1) { // wenn mehrere Felder gefunden wurden
if (logging) log('WertVor : ' + fields[0]);
var WertVor =fields[0];
if (logging) log("WertNach: " + fields[1]);
fields[0] = fields[0].replace(' ','_');
if (logging) log("Feld 1 : " + fields[0]);
if (logging) log("Feld 2 : " + fields[1]);
setState(pfad, WertVor); // Werte setzen
}
}
! // =============================================================================
// Daten abfragen
// =============================================================================
var databuf = '';
client.on('data', function(data) {
var prev = 0, next;
var datastr = data.toString();
if (logging) log("4. RX-Daten : " + datastr);
while ((next = datastr.indexOf('\n\n', prev)) > -1) {
databuf += datastr.substring(prev, next);
parse(databuf);
databuf = '';
prev = next + 1;
}
databuf += datastr.substring(prev);
client.write('quit\n');
});
! // =============================================================================
// ? Ende
// =============================================================================
client.on('close', function() {
log('Connection to ebusd closed');
});
! schedule('*/1 * * * *',data);Nun soll er jede Minute laufen schedule('*/1 * * * *',????); Wie muss die Zeile richtig aussehen? Gruß Jürgen
-
Es fehlt die passende Funktion. Wie ich das sehe, muss die Verbindung wieder hergestellt und eine Anforderung gesendet werden.
... function getData() { client.connect(port, host, function() { if (logging) log('Connected to ebusd on ' + host + ':' + port); client.write(req + '\n'); if (logging) log('TX-Befehl: "' + req + '" wird gesendet'); }); } schedule('*/1 * * * *', getData);
EDIT: Allerdings geht diese Funktion davon aus, dass die Verbindung jedesmal geschlossen wird (client.on('close',…). Ist das nicht der Fall, sollten die Variablen (oben im Skript) ergänzt werden
var conn = false;
Nach Herstellen der Verbindung dann
if (logging) log('2\. Connected to ebusd on ' + host + ':' + port); conn = true; client.write(req + '\n'); ...
Nach Schließen der Verbindung
client.on('close', function() { conn = false; log('Connection to ebusd closed'); });
und Abfrage innerhalb der Funktion getData()
function getData() { if(conn) { client.write(req + '\n'); if (logging) log('TX-Befehl: "' + req + '" wird gesendet'); } else { client.connect(port, host, function() { if (logging) log('Connected to ebusd on ' + host + ':' + port); conn = true; client.write(req + '\n'); if (logging) log('TX-Befehl: "' + req + '" wird gesendet'); }); } }
-
Danke für die Tipps
nun wird es sauber abgearbeitet.
Nun kommt die nächste Baustelle dass ich gleich mehrere Werte abfrage (Array)
Gruß
Jürgen