Node-RED zu influxdb2 Wert als Integer schreiben

Node-RED als CCU3/RaspberryMatic Addon, WebApp, HomeKit, ...

Moderator: Co-Administratoren

Antworten
Benutzeravatar
fairtv
Beiträge: 220
Registriert: 08.08.2014, 16:57
Wohnort: Bei Erding
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Node-RED zu influxdb2 Wert als Integer schreiben

Beitrag von fairtv » 10.03.2022, 09:11

Guten Morgen,

nach fast 10 Jahren war ein Zentralenupgrade notwendig. Den steinigen Weg hin zur Umsetzung (s.u.) erspare ich allen hier, danke aber schon mal allen Fleißigen, die so viel Tools und Software bereit stellen! Highcharts kommt wie ich in die Jahre und da ich gute Erfahrungen mit influx und grafana mit meinem Kraftwerksdaten habe, möchte ich die HM Daten künftig auch so sichern und darstellen.

Es läuft (fast) alles (!), nur beim Speichern in die influxDB bekomme ich keine Integerwerte hin. In Influx landet (legt influx so an) entweder ein String oder ein Float. Ich bin nur ein Gelegenheitsprogrammierer und mit meinem Latein hier am Ende.

Die Daten werden von einem Function Node aufbereitet und dann an den Adapter (node-red-contrib-stackhero-influxdb-v2) übergeben, verkürzt:

Code: Alles auswählen

var pl = {
    bucket: 'Homematic',
    precision: 's',
    data: [{
        measurement: msg.rooms[0],
        tags: {
         	'functions': msg.functions[0],
         	'device': msg.device,
         	'name': msg.deviceName,
         	'datapoint': msg.datapoint,
         	'channelName': msg.channelName.split(':')[0]
        },
        fields: {},
        timestamp: Math.round(msg.ts / 1000)
    }]
}
pl.data[0]['fields'][msg.datapoint] = msg.value;
msg.payload = pl;
return msg;
So landen Floats im influx.

Sobald ich bei einem Integerwert ein 'i' anfüge, landen Strings im Influx und keine Integer. Beispiel (Ergänzung zu obigem Code:

Code: Alles auswählen

...
if (msg.datapointType==='INTEGER')
{
   pl.data[0]['fields'][msg.datapoint] = msg.value+'i';
}
else
{
    pl.data[0]['fields'][msg.datapoint] = parseFloat(msg.value);
}
...
Ich denke, dass das bei JS ganz normal und gewollt ist.
Aber wie bekommt man dann ein Integer in die DB?

Umgebung: RPi4 8GB, USB-SSD, Docker/Portainer, RaspberryMatic, HmIP-RFUSB, RedMatic, Node-RED, influxDB 2 (alles aktuell).
Viele Grüße,
fairtv

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Re: Node-RED zu influxdb2 Wert als Integer schreiben

Beitrag von ueffchen » 10.03.2022, 13:49

Ich habe Deinen Code nicht gelesen, aber wenn Du Float-Werte in Int umwandeln willst, bevor Du an Influx übergibst, dann probier das mal aus:

Code: Alles auswählen

[{"id":"29e9c5c5.06464a","type":"debug","z":"92c60106.ca09f8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1140,"y":80,"wires":[]},{"id":"76ca38d8.8d0f48","type":"change","z":"92c60106.ca09f8","name":"","rules":[{"t":"set","p":"payload","pt":"msg","to":"$round(msg.payload, 0)\t","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":950,"y":80,"wires":[["29e9c5c5.06464a"]]},{"id":"54703c19.9ba214","type":"inject","z":"92c60106.ca09f8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"9.5","payloadType":"num","x":740,"y":80,"wires":[["76ca38d8.8d0f48"]]}]
Was ich nicht verstehe: warum fügst Du "+i" an, ist das eine typische Kennzeichnung für Influx für einen Int Wert? Generell wundert es mich nicht, dass eine "Zahl+i" als String verstanden wird.

Wenn ich Dein Problem falsch verstanden habe, dann meld Dich nochmal

Benutzeravatar
fairtv
Beiträge: 220
Registriert: 08.08.2014, 16:57
Wohnort: Bei Erding
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Node-RED zu influxdb2 Wert als Integer schreiben

Beitrag von fairtv » 10.03.2022, 15:11

Hi ueffchen,

ich will ja gar nicht umwandeln, der Wert wäre ja schon ein Integer.
Runden bringt nix, ebenso wie parseInt() wirkungslos bleibt, sobald man dieses 'i' anfügt.

Die Influxdoku sagt (zumindest beim üblichen Line Protocol):
Integer: Specify an integer with a trailing i on the number. Example: 1i.
Klar das JS das dann für einen String hält, aber Influx müsste doch selbst so schlau sein und es als Int behandeln.
Oder der Adapter macht irgendein anderes Protokoll für das irgendwas anderes gilt.
Viele Grüße,
fairtv

ueffchen
Beiträge: 176
Registriert: 29.03.2011, 10:35
Hat sich bedankt: 4 Mal
Danksagung erhalten: 13 Mal

Re: Node-RED zu influxdb2 Wert als Integer schreiben

Beitrag von ueffchen » 10.03.2022, 16:37

ok, komisch. Dann müsste Influx das ja auch verstehen und entsprechend behandeln, wenn schon ein "i" gefordert wird.
Warum kannst Du nicht einfach Float übergeben?
Oder anders gefragt, wenn Du nur Integer ohne "i" übergibst, was passiert dann?

Benutzeravatar
fairtv
Beiträge: 220
Registriert: 08.08.2014, 16:57
Wohnort: Bei Erding
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Node-RED zu influxdb2 Wert als Integer schreiben

Beitrag von fairtv » 10.03.2022, 18:14

ohne 'i' wird's ein Float.
Da beides glaub ich am Ende eh 64bit sind, macht es beim Platz wohl nix aus.
Es fuxt mich nur.
Und man spart sich bei den Grafen das Gerunde, dort steht dann sonst oft ,0.
Mag das nicht.
Aus Prinzip.
Viele Grüße,
fairtv

Benutzeravatar
fairtv
Beiträge: 220
Registriert: 08.08.2014, 16:57
Wohnort: Bei Erding
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Node-RED zu influxdb2 Wert als Integer schreiben

Beitrag von fairtv » 17.03.2022, 15:53

ok, ich glaube es liegt am Adapter node-red-contrib-stackhero-influxdb-v2.
Viele Grüße,
fairtv

Antworten

Zurück zu „RedMatic“