NEWS
Freie Definition von Tags und states für influxdb 2.0
-
Nach längere Zeit bin ich wieder aktiv an meiner iobroker Installation. In diesem Zusammenhang habe ich die influxdb von 1.0 auf 2.0 umgestellt und möchte nun die volle Funktionalität der Tags in influx nutzen.
Da ich bei dem sendto keine Möglichkeit gefunden habe, diese Parameter selbst zu setzen, habe ich folgendes Script entwickelt (Einbindung von @influxdata/influxdb-client-apis und @influxdata/influxdb-client im javascript Adapter vorausgesetzt):
const { InfluxDB, Point } = require('@influxdata/influxdb-client') const token = "MEIN TOKEN"; const url = 'MEINE URL; let org = `MEINE ORGANISATION`; let bucket = `iobroker`; const client = new InfluxDB({ url, token }); let writeClient = client.getWriteApi(org, bucket, 'ns') // // Messwerte in Influx-DB schreiben, alle 10 Sekunden // function write2influxDB() { // // Interface zu Solaranzeige // function writeSolaranzeige2Influx(location, device, typ) { let datum = Date.now() * 1000000; let BatSpannung = getState('mqtt-client.0.solaranzeige.laderegler.batteriespannung').val; let BatTemp = getState('mqtt-client.0.solaranzeige.laderegler.batterietemperatur').val; let BatStatus = getState('mqtt-client.0.solaranzeige.laderegler.batteriesoc').val; let BatMinVoltHeute = getState('mqtt-client.0.solaranzeige.laderegler.batterieminvoltheute').val; let BatMaxVoltHeute = getState('mqtt-client.0.solaranzeige.laderegler.batteriemaxvoltheute').val; let BatLadeStrom = getState('mqtt-client.0.solaranzeige.laderegler.batterieladestrom').val; let BatEndladeStrom = getState('mqtt-client.0.solaranzeige.laderegler.batterieentladestrom').val; let BatEntladeLeistung = getState('mqtt-client.0.solaranzeige.laderegler.batterieentladeleistung').val; let BatSolarLeistung = getState('mqtt-client.0.solaranzeige.laderegler.solarleistung').val; let BatSolarSpannung = getState('mqtt-client.0.solaranzeige.laderegler.solarspannung').val; let BatSolarSpannungMaxHeute = getState('mqtt-client.0.solaranzeige.laderegler.solarspannungmaxheute').val; let BatSolarStrom = getState('mqtt-client.0.solaranzeige.laderegler.solarstrom').val; let BatLadereglerTemp = getState('mqtt-client.0.solaranzeige.laderegler.temperatur').val; let BatVerbrauchGesamt = getState('mqtt-client.0.solaranzeige.laderegler.verbrauchgesamt').val; let BatVerbrauchGesamtHeute = getState('mqtt-client.0.solaranzeige.laderegler.verbrauchgesamtheute').val; let BatWattStundenGesamt = getState('mqtt-client.0.solaranzeige.laderegler.wattstundengesamt').val; let BatWattStundenGesamtHeute = getState('mqtt-client.0.solaranzeige.laderegler.wattstundengesamtheute').val; let BatTimeStamp = getState('mqtt-client.0.solaranzeige.laderegler.zentralertimestamp').val; let point = new Point('Solaranzeige') .tag('Location', location) .tag('Device', device) .tag('Element', 'Batterie') .tag('Typ', typ) .floatField('Spannung', BatSpannung) .floatField('Ladestrom', BatLadeStrom) .floatField('Entladestrom', BatEndladeStrom) .floatField('Entladeleistung', BatEntladeLeistung) .floatField('Temperatur', BatLadereglerTemp) .floatField('SpannungMaxHeute', BatMaxVoltHeute) .floatField('SpannungMinHeute', BatMinVoltHeute) .floatField('BatterieTemp', BatTemp) .floatField('SolarLeistung', BatSolarLeistung) .floatField('SolarSpannung', BatSolarSpannung) .floatField('SolarSpannungHeuteMax', BatSolarSpannungMaxHeute) .floatField('SolarStrom', BatSolarStrom) .floatField('Verbrauch', BatVerbrauchGesamt) .floatField('VerbrauchGesamtHeute', BatMaxVoltHeute) .floatField('SpannungMinHeute', BatVerbrauchGesamtHeute) .floatField('WattStundenGesamt', BatWattStundenGesamt) .floatField('Zeitstempel', BatTimeStamp) .floatField('WattStundenGesamtheute', BatWattStundenGesamtHeute) .floatField('Ladezustand', BatStatus) .timestamp(datum) writeClient.writePoint(point) } // // Hauptfunktion // // Schreiben Homematic Steckdosen // // // Schreiben Solarzeige // writeSolaranzeige2Influx('Garage', 'Solaranzeige', 'GesamteAnlage'); // // alle 5 Sekunden Zwischenspeicher übertragen // void setTimeout(() => { writeClient.flush() }, 5000) } let scheduler = schedule('*/10 * * * * *', write2influxDB); // alle 10 Sekunden
Ergebnis:
Dieser Abaluf inkl. der Datenspeicherung in der Datenbank scheint korrekt zu sein und alle Daten sind vorhanden. Außerdem hat dieser Vorgang die positive Nebenwirkung, dass ich beim Austausch von Geräten nur die entsprechenden Objekte hier ändern muss.Jetzt zu meinem Problem:
Von Zeit zu Zeit kommt im iobroker-Log eine Fehlermedung.2023-12-09 13:34:55.008 - error: javascript.0 (1261) An error happened which is most likely from one of your scripts, but the originating script could not be detected. 2023-12-09 13:34:55.008 - error: javascript.0 (1261) Error: Request timed out 2023-12-09 13:34:55.008 - error: javascript.0 (1261) RequestTimedOutError: Request timed outcode_text
Diese Fehlermeldung kommt manchmal 2 * täglich, manchmal häufig, zeitlich absolut unvorhersehbar.
Gibt es einen Experten, der sich dies einmal ansehen kann und mir einen Tip geben kann?
Eine instabile Netzwerkverbindung kann ich ausschließen. -
Die Timeouts kommen mit einiger Wahrscheinlichkeit beim Schreiben in die Influxdb. Du könntest mal versuchen, den Wert hochzusetzen.
const client = new InfluxDB({ url , token, org, timeout: 30000 }); // Timeout in milliseconds
-
@kamikaze Hello Marc,
sorry for my late answer. This tip work. I do not get any error message.
Thank you very much. -
@kamikaze
super wenn Dir geholfen wurde - aber warum plötzlich in englisch schreiben ?