Keine Datenübertragung bei negativen Temperaturen

Hallo zusammen,

mir ist aufgefallen, dass unsere SenseBox:home bei Temperaturen unter 0 aus dem Tritt kommt.

Man erkennt es gut an den Graphen auf der OpenSenseMap, sobald die Temperatur unter den Nullpunkt sinkt schlägt die Datenübertragung zur OpenSenseMap fehl. Sobald die Temperatur wieder positiv ist werden wieder Daten übertragen. Auffällig ist dabei, dass der Beleuchtungssensor und der Luftdrucksensor danach eingefroren sind und immer den selben(falschen) Wert liefern(Licht 0lx/Atm 649,43hPa).

Ich habe die Werte lokal an der Box gelogged und festgestellt, dass die Temperatur in der POST Anfrage falsch Angezeigt wird, das „-“ ist um zwei Stellen nach Rechts verschoben.

`„Measurements saved in box“
disconnecting from server.
done!
Loop
Condition: SubZero
0.00
submit values
connecting…
Connection successful, transferring…
POST /boxes/61530b521380ac001bba8318/data HTTP/1.1
Authorization: 8587857cbe6afa716bd3fc2606b9f0012645cfb12e79fbce8967aab8dc090548
Host: ingress.opensensemap.org
Content-Type: text/csv
Connection: close
Content-Length: 246

61530b521380ac001bba831f,0.-3
61530b521380ac001bba831e,78.88
61530b521380ac001bba831d,649.43
61530b521380ac001bba831c,0.00
61530b521380ac001bba831b,0.00
61530b521380ac001bba831a,30.50
61530b521380ac001bba8319,10.00
61530e3d1380ac001bbbd532,0.00
HTTP/1.1 422 Unprocessable Entity
Content-Length: 135
Content-Type: application/json; charset=utf-8
Date: Tue, 08 Mar 2022 02:58:06 GMT
Deprecation-Warning: If your client supports TLS, please use https://ingress.opensensemap.org
Connection: close

{„code“:„UnprocessableEntity“,„message“:„Invalid value in measurement {„sensor_id“:„61530b521380ac001bba831f“,**„value“:„0.-3“**}“}
disconnecting from server.
done!`

Anstelle der 0,-3 sollte eigentlich -0,03 stehen.

Evtl. liegt das an unserer Modifikation an der Berechnung der dataLength, ich kann mir aber nicht ganz erklären wie es dazu kommt:

void addMeasurement(const char *sensorId, float value) {
  measurements[num_measurements].sensorId = sensorId;
  measurements[num_measurements].value = value;
  num_measurements++;
  dataLength += String(sensorId).length() + 1; //length of ID + ','
  //dataLength += String((int)value * 100).length() + 1; //length of measurement value + decimal digit
  dataLength += String((int)value).length() + 1 + 2; //length of measurement value int part + decimal digit + 2x frac part
  if(value<0){
    dataLength+= String((int)value).length() + 1;
    DEBUG("Condition: SubZero");
  }
}

Die Modifikation haben wir für unsere selbstgebauten Regenmesser vorgenommen.

Vielen Dank im Voraus für jede Hilfe.

Luca