NEWS
[gelöst] Fehler beim Schreiben in Influx mit JavaScript
-
Hallo an alle,
ich bin gerade dabei meine influxDB ein wenig besser zu organisieren und möchte nicht mehr mit jeden Objekt ein neues MEASUREMENT in der DB zu erstellen, sondern ich möchte es ein wenig mehr strukturieren.
Vor einiger Zeit habe ich von haus-automation das Video zum schreiben der PV-Daten in die Influx gesehen. Das ganze finde ich sehr smart und wollte es bei mir genauso umsetzten, aber leider bekomme ich dabei einen Fehler und ich kann damit überhaupt nichts anfangen.Also ich nutze den JavaScript Adapter 8.3.1.
Meine InfluxDB2 läuft ohne Probleme.
Ich habe den Script V0.2 vom youtube Kanal kopiert und an meine Bedürfnisse angepasst.Folgende Protokollausgaben bekomme ich:
javascript.0 15:18:52.924 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: registered 0 subscriptions, 0 schedules, 0 messages, 0 logs and 0 file subscriptions javascript.0 15:18:52.931 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: getObject(id=system.adapter.influxdb.0, enumName=null) => {"_id":"system.adapter.influxdb.0","type":"instance","common":{"name":"influxdb","desc":{"en":"Logging of states into InfluxDB","de":"Loggt die Historie von einzelnen Zuständen in einer InfluxDB","ru":"Сохраняет историю событий для отдельных состояний в InfluxDB","pt":"Registro de estados no InfluxDB","nl":"Loggen van staten in InfluxDB","fr":"Journalisation des états dans InfluxDB","it":"Registrazione degli stati in InfluxDB","es":"Registro de estados en InfluxDB","pl":"Logowanie stanów do InfluxDB","zh-cn":"将状态记录到InfluxDB中"},"version":"4.0.2","title":"Logging data with InfluxDB","titleLang":{"en":"Logging data with InfluxDB","de":"Daten mit InfluxDB protokollieren","ru":"Запись данных с помощью InfluxDB","pt":"Registro de dados com InfluxDB","nl":"Loggen van gegevens met InfluxDB","fr":"Consignation des données avec InfluxDB","it":"Registrazione dei dati con InfluxDB","es":"Datos de registro con InfluxDB","pl":"Rejestrowanie danych za pomocą InfluxDB","zh-cn":"使用InfluxDB记录数据"},"mode":"daemon","platform":"Javascript/Node.js","loglevel":"info","messagebox":true,"subscribe":"messagebox","keywords":["charts","logging","influxdb"],"preserveSettings":"custom","supportCustoms":true,"getHistory":true,"enabled":true,"compact":true,"dependencies":[{"js-controller":">=3.3.0"}],"globalDependencies":[{"admin":">=5.1.28"}],"supportStopInstance":10000,"stopTimeout":10000,"authors":["Bluefox <dogafox@gmail.com>","Apollon77 <ingo@fischer-ka.de>","Excodibur"],"license":"MIT","readme":"https://github.com/ioBroker/ioBroker.influxdb/blob/master/README.md","icon":"influxdb.png","extIcon":"https://raw.githubusercontent.com/ioBroker/ioBroker.influxdb/master/admin/influxdb.png","type":"storage","docs":{"de":["docs/de/influxdb.md"]},"plugins":{"sentry":{"dsn":"https://29eecf4e8c954f2ea78110d47a9b122d@sentry.iobroker.net/54"}},"adminUI":{"config":"json","custom":"json"},"connectionType":"local","dataSource":"push","tier":1,"eraseOnUpload":true,"messages":[{"condition":{"operand":"and","rules":["oldVersion<2.1.1","newVersion>=2.1.1"]},"title":{"en":"Password needs to re re-entered after upgrade and other changes","de":"Das Passwort muss nach dem Upgrade erneut eingegeben werden","ru":"Пароль необходимо повторно ввести после обновления","pt":"A senha precisa ser reinserida após a atualização","nl":"Wachtwoord moet opnieuw worden ingevoerd na upgrade","fr":"Le mot de passe doit être ressaisi après la mise à niveau","it":"La password deve essere reinserita dopo l'aggiornamento","es":"La contraseña debe volver a ingresarse después de la actualización","pl":"Hasło musi zostać ponownie wprowadzone po aktualizacji","zh-cn":"升级后需要重新输入密码"},"text":{"en":"After upgrading to Version 2.1.1 or later you need to re-entr your passwort/token for the access to the InfluxDB in the instance configuration.","de":"Nach dem Upgrade auf Version 2.1.1 oder höher müssen Sie Ihr Passwort/Token für den Zugriff auf die InfluxDB in der Instanzkonfiguration erneut eingeben.","ru":"После обновления до версии 2.1.1 или более поздней вам необходимо повторно ввести свой пароль/токен для доступа к InfluxDB в конфигурации экземпляра.","pt":"Após atualizar para a Versão 2.1.1 ou posterior, você precisa reinserir sua senha/token para acesso ao InfluxDB na configuração da instância.","nl":"Na het upgraden naar versie 2.1.1 of hoger moet u uw wachtwoord/token opnieuw invoeren voor toegang tot de InfluxDB in de instantieconfiguratie.","fr":"Après la mise à niveau vers la version 2.1.1 ou ultérieure, vous devez ressaisir votre mot de passe/token pour l'accès à InfluxDB dans la configuration de l'instance.","it":"Dopo l'aggiornamento alla versione 2.1.1 o successiva è necessario reinserire la password/token per l'accesso a InfluxDB nella configurazione dell'istanza.","es":"Después de actualizar a la versión 2.1.1 o posterior, debe volver a ingresar su contraseña/token para acceder a InfluxDB en la configuración de la instancia.","pl":"Po aktualizacji do wersji 2.1.1 lub nowszej należy ponownie wprowadzić hasło/token, aby uzyskać dostęp do bazy danych InfluxDB w konfiguracji instancji.","zh-cn":"升级到 2.1.1 或更高版本后,您需要重新输入密码/令牌才能在实例配置中访问 InfluxDB。"},"level":"warn","buttons":["agree","cancel"]},{"condition":{"operand":"and","rules":["oldVersion<3.0.0","newVersion>=3.0.0"]},"title":{"en":"Important notice!","de":"Wichtiger Hinweis!","ru":"Важное замечание!","pt":"Notícia importante!","nl":"Belangrijke mededeling!","fr":"Avis important!","it":"Avviso IMPORTANTE!","es":"Noticia importante!","pl":"Ważna uwaga!","zh-cn":"重要通知!"},"text":{"en":"This new version introduces several changes how values are logged because we fixed several issues and added new features. Please especially check the defined \"debounce\" and \"block time\" settings in your datapoints if values are not logged as expected and make sure the settings make sense. For more details please refer to the changelog and Readme.","de":"Diese neue Version führt mehrere Änderungen ein, wie Werte protokolliert werden, da wir mehrere Probleme behoben und neue Funktionen hinzugefügt haben. Bitte überprüfen Sie insbesondere die definierten „Entprellen“- und „Sperrzeit“-Einstellungen in Ihren Datenpunkten, wenn Werte nicht wie erwartet protokolliert werden, und stellen Sie sicher, dass die Einstellungen sinnvoll sind. Weitere Details finden Sie im Changelog und in der Readme.","ru":"В этой новой версии внесено несколько изменений в регистрацию значений, поскольку мы исправили несколько проблем и добавили новые функции. Пожалуйста, особенно проверьте определенные настройки «debounce» и «block time» в ваших точках данных, если значения не регистрируются должным образом, и убедитесь, что настройки имеют смысл. Для получения более подробной информации, пожалуйста, обратитесь к журналу изменений и Readme.","pt":"Esta nova versão apresenta várias alterações na forma como os valores são registrados, pois corrigimos vários problemas e adicionamos novos recursos. Verifique especialmente as configurações definidas de \"debounce\" e \"block time\" em seus pontos de dados se os valores não forem registrados conforme o esperado e verifique se as configurações fazem sentido. Para obter mais detalhes, consulte o log de alterações e o Leiame.","nl":"Deze nieuwe versie introduceert verschillende wijzigingen in de manier waarop waarden worden geregistreerd, omdat we verschillende problemen hebben opgelost en nieuwe functies hebben toegevoegd. Controleer vooral de gedefinieerde \"debounce\" en \"block time\" instellingen in uw datapunten als de waarden niet zijn vastgelegd zoals verwacht en zorg ervoor dat de instellingen kloppen. Raadpleeg de changelog en Readme voor meer informatie.","fr":"Cette nouvelle version introduit plusieurs changements dans la journalisation des valeurs car nous avons corrigé plusieurs problèmes et ajouté de nouvelles fonctionnalités. Veuillez vérifier en particulier les paramètres \"anti-rebond\" et \"temps de blocage\" définis dans vos points de données si les valeurs ne sont pas enregistrées comme prévu et assurez-vous que les paramètres ont un sens. Pour plus de détails, veuillez consulter le journal des modifications et le fichier Lisez-moi.","it":"Questa nuova versione introduce diverse modifiche al modo in cui i valori vengono registrati perché abbiamo risolto diversi problemi e aggiunto nuove funzionalità. Controllare in particolare le impostazioni definite \"debounce\" e \"block time\" nei propri datapoint se i valori non sono registrati come previsto e assicurarsi che le impostazioni abbiano un senso. Per maggiori dettagli, fare riferimento al log delle modifiche e al Leggimi.","es":"Esta nueva versión introduce varios cambios en la forma en que se registran los valores porque solucionamos varios problemas y agregamos nuevas funciones. Verifique especialmente la configuración definida de \"antirrebote\" y \"tiempo de bloqueo\" en sus puntos de datos si los valores no se registran como se esperaba y asegúrese de que la configuración tenga sentido. Para obtener más detalles, consulte el registro de cambios y el archivo Léame.","pl":"Ta nowa wersja wprowadza kilka zmian w sposobie rejestrowania wartości, ponieważ naprawiliśmy kilka problemów i dodaliśmy nowe funkcje. W szczególności sprawdź zdefiniowane ustawienia „odbicia” i „czasu blokowania” w punktach danych, jeśli wartości nie są rejestrowane zgodnie z oczekiwaniami i upewnij się, że ustawienia mają sens. Aby uzyskać więcej informacji, zapoznaj się z dziennikiem zmian i Readme.","zh-cn":"这个新版本引入了一些更改值的记录方式,因为我们修复了几个问题并添加了新功能。如果未按预期记录值,请特别检查数据点中定义的“去抖动”和“阻塞时间”设置,并确保设置有意义。有关更多详细信息,请参阅更改日志和自述文件。"},"link":"https://github.com/ioBroker/ioBroker.influxdb/blob/master/README.md#default-settings","level":"warn","linkText":{"en":"Readme","de":"Liesmich","ru":"Прочти меня","pt":"Leia-me","nl":"Leesmij","fr":"Lisez-moi","it":"Leggimi","es":"Léame","pl":"Readme","zh-cn":"自述文件"},"buttons":["agree","cancel"]}],"installedFrom":"iobroker.influxdb@4.0.2","installedVersion":"4.0.2","host":"PIArgon"},"native":{"debounce":1000,"retention":0,"dbname":"iobrokerInflux","host":"192.168.178.36","protocol":"http","path":"","port":8086,"user":"","organization":"Andy-org","round":4,"seriesBufferMax":0,"seriesBufferFlushInterval":600,"changesRelogInterval":0,"changesMinDelta":0,"reconnectInterval":10000,"pingInterval":15000,"requestTimeout":30000,"validateSSL":true,"dbversion":"2.x","usetags":false,"pingserver":true,"blockTime":0,"debounceTime":0,"disableSkippedValueLogging":false,"enableLogging":false,"customRetentionDuration":365,"relogLastValueOnStart":true},"acl":{"object":1636,"owner":"system.user.admin","ownerGroup":"system.group.administrator"},"protectedNative":["password","token"],"encryptedNative":["password","token"],"notifications":[],"instanceObjects":[{"_id":"info","type":"channel","common":{"name":"Information"},"native":{}},{"_id":"info.connection","type":"state","common":{"role":"indicator.connected","name":"If connected to InfluxDB","type":"boolean","read":true,"write":false,"def":false},"native":{}}],"objects":[],"from":"system.host.PIArgon","user":"system.user.admin","ts":1717320803267} javascript.0 15:18:52.932 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: Starting "energy-stats-test" logging to http://192.168.178.36:8086 into bucket "iobrokerInflux" by org Andy-org javascript.0 15:18:53.029 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: subscribe: {"pattern":{"id":"0_userdata.0.Eigene_Daten.Energie.Strompreis_Bezug","change":"ne","q":0},"name":"script.js.common.Solar.InfluxDb2.Solar_Stromzaehler"} javascript.0 15:18:53.030 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: subscribe: {"pattern":{"id":"0_userdata.0.Eigene_Daten.Energie.Strompreis_Einspeisung","change":"ne","q":0},"name":"script.js.common.Solar.InfluxDb2.Solar_Stromzaehler"} javascript.0 15:18:53.030 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: subscribe: {"pattern":{"id":"0_userdata.0.Eigene_Daten.Energie.Zaehler_Strombezug_1_8_0_Influx","change":"ne","q":0},"name":"script.js.common.Solar.InfluxDb2.Solar_Stromzaehler"} javascript.0 15:18:53.030 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: subscribe: {"pattern":{"id":"0_userdata.0.Eigene_Daten.Energie.Zaehler_Netzeinspeisung_2_8_0_Influx","change":"ne","q":0},"name":"script.js.common.Solar.InfluxDb2.Solar_Stromzaehler"} javascript.0 15:18:53.030 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: subscribe: {"pattern":{"id":"0_userdata.0.Eigene_Daten.Solar.Solar_gesamt.Arbeit_Solar_gesamt_Wh","change":"ne","q":0},"name":"script.js.common.Solar.InfluxDb2.Solar_Stromzaehler"} javascript.0 15:18:56.203 info script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: httpPost(config={"method":"post","url":"http://192.168.178.36:8086/api/v2/write?bucket=iobrokerInflux&org=Andy-org","responseType":"text","responseEncoding":"utf8","timeout":2000,"headers":{"User-Agent":"Mozilla/5.0 (X11; Linux i686; rv:109.0) Gecko/20100101 Firefox/121.0","Content-Type":"text/plain","Authorization":"Token 2ogcJe1JY7W-zmY0Mn-iF4t76mqwS0PMwDi5JgPCWJphxr-zaypwr8HHHJRRJAe9YYf0GOwB-aFW_x_QoUb7xw=="},"data":"energy-stats-test priceIn=0.41,priceOut=0,importedWh=2574879.71363,exportedWh=3109264.48031,generatedWh=5413791"}, data=energy-stats-test priceIn=0.41,priceOut=0,importedWh=2574879.71363,exportedWh=3109264.48031,generatedWh=5413791) javascript.0 15:18:56.234 error script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: TypeError: Cannot read properties of undefined (reading 'catch') javascript.0 15:18:56.234 error at Object.<anonymous> (script.js.common.Solar.InfluxDb2.Solar_Stromzaehler:60:15)
Was mich wundert, das im Javascript Code einige Zeilen rot unterstrichen sind.
const axios = require('axios').default;
Das ('axios') ist rot unterstrichen.
if (data) { // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`); httpPost(`${protocol}://${host}:${port}/api/v2/write?bucket=${bucket}&org=${org}`, data, { headers: { 'Content-Type': 'text/plain', 'Authorization': `Token ${token}` } }).catch(err => { console.error(err); }); }
Ab "headers" bis zur zweiten gescheifften Klammer hinter "Token" und das Wort "catch" sind rot unterstrichen.
Ist da etwas falsch und macht das nichts?Dies ist der JavaScript-Code, den ich gerade versuche, zum Laufen zu bringen.
// v0.2 const axios = require('axios').default; const influxDbInstance = 'influxdb.0'; const token = 'XXXXXJY7W-zmY0Mn-iF4t76mqwS0PMwDi5JgPCWJphxr-zaypwr8HHHJRRJAe9YYf0GOwB-aFW_x_QoUb7xw=='; const measurement = 'energy-stats-test'; const loggingTemplate = { '0_userdata.0.Eigene_Daten.Energie.Strompreis_Bezug': 'priceIn', '0_userdata.0.Eigene_Daten.Energie.Strompreis_Einspeisung': 'priceOut', '0_userdata.0.Eigene_Daten.Energie.Zaehler_Strombezug_1_8_0_Influx': 'importedWh', '0_userdata.0.Eigene_Daten.Energie.Zaehler_Netzeinspeisung_2_8_0_Influx': 'exportedWh', '0_userdata.0.Eigene_Daten.Solar.Solar_gesamt.Arbeit_Solar_gesamt_Wh': 'generatedWh', }; const loggingObj = {}; async function start() { const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`); const protocol = influxDbInstanceConfig.native.protocol; const host = influxDbInstanceConfig.native.host; const port = influxDbInstanceConfig.native.port; const org = influxDbInstanceConfig.native.organization; const bucket = influxDbInstanceConfig.native.dbname; console.log(`Starting "${measurement}" logging to ${protocol}://${host}:${port} into bucket "${bucket}" by org ${org}`); // Init loggingObj with current values for (let [objId, key] of Object.entries(loggingTemplate)) { const state = await getStateAsync(objId); if (state && !isNaN(state.val)) { loggingObj[key] = state.val; } else { loggingObj[key] = 0; } } on({ id: Object.keys(loggingTemplate), change: 'ne' }, async (obj) => { // Update value in loggingObj const key = loggingTemplate[obj.id]; loggingObj[key] = obj.state.val; // Save Data const data = `${measurement} ${Object.keys(loggingObj) .filter(key => !isNaN(loggingObj[key])) .map((key) => `${key}=${loggingObj[key]}`) .join(',')}`; if (data) { // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`); httpPost(`${protocol}://${host}:${port}/api/v2/write?bucket=${bucket}&org=${org}`, data, { headers: { 'Content-Type': 'text/plain', 'Authorization': `Token ${token}` } }).catch(err => { console.error(err); }); } }); } start();
In meiner InfluxDB ist das measurement mit den entsprechenden fields angelegt worden, aber keine Werte.
Meine Variablen sind alle als number gespeichert.
Könnt ihr mir dabei helfen? -
@kapitaen31
Da scheinen ein paar Klammern falsch zu sein.
Klappt es hiermit besser (ungetestet)
Sonst müssen doch Profis ran.const influxDbInstance = 'influxdb.0'; const token = 'XXXXXJY7W-zmY0Mn-iF4t76mqwS0PMwDi5JgPCWJphxr-zaypwr8HHHJRRJAe9YYf0GOwB-aFW_x_QoUb7xw=='; const measurement = 'energy-stats-test'; const loggingTemplate = { '0_userdata.0.Eigene_Daten.Energie.Strompreis_Bezug': 'priceIn', '0_userdata.0.Eigene_Daten.Energie.Strompreis_Einspeisung': 'priceOut', '0_userdata.0.Eigene_Daten.Energie.Zaehler_Strombezug_1_8_0_Influx': 'importedWh', '0_userdata.0.Eigene_Daten.Energie.Zaehler_Netzeinspeisung_2_8_0_Influx': 'exportedWh', '0_userdata.0.Eigene_Daten.Solar.Solar_gesamt.Arbeit_Solar_gesamt_Wh': 'generatedWh', }; const loggingObj = {}; async function start() { const influxDbInstanceConfig = await getObjectAsync(`system.adapter.${influxDbInstance}`); const protocol = influxDbInstanceConfig.native.protocol; const host = influxDbInstanceConfig.native.host; const port = influxDbInstanceConfig.native.port; const org = influxDbInstanceConfig.native.organization; const bucket = influxDbInstanceConfig.native.dbname; console.log(`Starting "${measurement}" logging to ${protocol}://${host}:${port} into bucket "${bucket}" by org ${org}`); // Init loggingObj with current values for (let [objId, key] of Object.entries(loggingTemplate)) { const state = await getStateAsync(objId); if (state && !isNaN(state.val)) { loggingObj[key] = state.val; } else { loggingObj[key] = 0; } } on({ id: Object.keys(loggingTemplate), change: 'ne' }, async (obj) => { // Update value in loggingObj const key = loggingTemplate[obj.id]; loggingObj[key] = obj.state.val; // Save Data const data = `${measurement} ${Object.keys(loggingObj) .filter(key => !isNaN(loggingObj[key])) .map((key) => `${key}=${loggingObj[key]}`) .join(',')}`; if (data) { // console.log(`Saving "${data}" to InfluxDB @ ${protocol}://${host}:${port}/`); httpPost(`${protocol}://${host}:${port}/api/v2/write?bucket=${bucket}&org=${org}`, data, { headers: { 'Content-Type': 'text/plain', 'Authorization': `Token ${token}` } }.catch(err => { console.error(err); })); } }); } start();
-
@mrjeschke said in Fehler beim Schreiben in Influx mit JavaScript:
@kapitaen31
Da scheinen ein paar Klammern falsch zu sein.
Klappt es hiermit besser (ungetestet)
Sonst müssen doch Profis ran.Danke,
habe ich eben eingespielt, aber jetzt erscheinen folgende Fehler:javascript.0 19:06:01.588 error script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: TypeError: {(intermediate value)}.catch is not a function javascript.0 19:06:01.589 error at Object.<anonymous> (script.js.common.Solar.InfluxDb2.Solar_Stromzaehler:57:20) javascript.0 19:06:11.570 error script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: TypeError: {(intermediate value)}.catch is not a function javascript.0 19:06:11.570 error at Object.<anonymous> (script.js.common.Solar.InfluxDb2.Solar_Stromzaehler:57:20) javascript.0 19:06:31.580 error script.js.common.Solar.InfluxDb2.Solar_Stromzaehler: TypeError: {(intermediate value)}.catch is not a function javascript.0 19:06:31.581 error at Object.<anonymous> (script.js.common.Solar.InfluxDb2.Solar_Stromzaehler:57:20)
-
@kapitaen31 sagte: Das ('axios') ist rot unterstrichen.
Weshalb require('axios'), wenn stattdessen httpPost() verwendet wird?
Verwende httpPost() so, wie in der Doku beschrieben.
-
@kapitaen31 sagte in Fehler beim Schreiben in Influx mit JavaScript:
Vor einiger Zeit habe ich von haus-automation das Video zum schreiben der PV-Daten in die Influx gesehen.
Sorry, hatte die neue Version des Scripts (ohne axios, direkt mit httpPost) selbst noch nicht getestet und versehentlich schon online gestellt. Funktioniert jetzt (v0.3):
https://haus-automatisierung.com/software/2023/05/11/influxdb2-pv-dashboard.html
-
@haus-automatisierung said in Fehler beim Schreiben in Influx mit JavaScript:
@kapitaen31 sagte in Fehler beim Schreiben in Influx mit JavaScript:
Vor einiger Zeit habe ich von haus-automation das Video zum schreiben der PV-Daten in die Influx gesehen.
Sorry, hatte die neue Version des Scripts (ohne axios, direkt mit httpPost) selbst noch nicht getestet und versehentlich schon online gestellt. Funktioniert jetzt (v0.3):
https://haus-automatisierung.com/software/2023/05/11/influxdb2-pv-dashboard.html
Perfekt... Jetzt läuft es. Vielen Dank...