De iSpindel plato berekening is in het webscript gezet omdat er dan met meer cijfers achter de komman gerekend wordt. De uitkomst verschilt 0.25 plato! De calibratie is nu dus extern.

Sat, 19 Aug 2023 15:11:35 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Sat, 19 Aug 2023 15:11:35 +0200
changeset 847
dc9281501ca6
parent 846
d8ace3fa9ac7
child 848
542bdc7f6522

De iSpindel plato berekening is in het webscript gezet omdat er dan met meer cijfers achter de komman gerekend wordt. De uitkomst verschilt 0.25 plato! De calibratie is nu dus extern.

doc/bms-ch8.sgml file | annotate | diff | comparison | revisions
www/ispindel/index.php file | annotate | diff | comparison | revisions
--- a/doc/bms-ch8.sgml	Sun Mar 05 12:44:33 2023 +0100
+++ b/doc/bms-ch8.sgml	Sat Aug 19 15:11:35 2023 +0200
@@ -52,8 +52,10 @@
 <listitem><para>NCMD is een commando bestemd voor een node.
 Dit kan bijvoorbeeld een reboot commando zijn.</para></listitem>
 <listitem><para>NDATA wordt verstuurd als er veranderingen zijn voor de node,
-maar ook iedere vijf minuten om aan te geven dat de node nog "levend" en aanwezig
-is.</para></listitem>
+maar ook regelmatig om aan te geven dat de node nog "levend" en aanwezig
+is. Deze tijd is voor ieder node type verschillend. Indien twee maal de ingestelde
+tijd plus enkele seconden geen NDATA bericht is gezien dan wordt de node als
+offline beschouwd. Indien deze waarde niet aanwezig is wordt 300 seconden aangehouden.</para></listitem>
 
 <listitem><para>DBIRTH is een of meer berichten van een apparaat wat online komt
 en ingeschakeld is. Een apparaat is een deel van een node.
@@ -85,14 +87,20 @@
 ingevuld en is de tijd dat het bericht ontvangen wordt.
 Het `seq' nummer wordt met ieder bericht met 1 verhoogd.
 Ook dit nummer is niet altijd aanwezig.</para>
+<para>Deze payload wordt verstuurd als een node start, <code>message_type NBIRTH</code>.
+Het wordt ook vertuurd als er iets wijzigd, bijvoorbeeld de temperatuur en op vaste
+intervals. In die gevallen is het <code>message_type NDATA</code>.</para>
 <para>In de `metric' groep is de `interval' optioneel. Dit wordt bijvoorbeeld
 verstuurd door iSpindels en is de ingestelde update interval tijd in seconden.
 Indien dit niet aanwezig is dan wordt 300 seconden als standaard waarde gebruikt.
 Deze waarde wordt gebruikt om een apparaat als offline te markeren indien het langer
 als twee maal deze tijd niet wordt gezien.</para>
+<para>Alle object groepen binnen het metric object kunnen maar hoeven niet aanwezig te zijn.
+Dit geld ook voor de diverse items in de groepen.</para>
 <programlisting>
 {
   "timestamp": 1532201089,
+  "sec": 1234,
   "metric": {
     "uuid": "b508f01c-1f82-4e8b-b0d2-d88ecfb53031",
     "interval":300,
--- a/www/ispindel/index.php	Sun Mar 05 12:44:33 2023 +0100
+++ b/www/ispindel/index.php	Sat Aug 19 15:11:35 2023 +0200
@@ -7,8 +7,21 @@
 	$publisher = '/usr/bin/mosquitto_pub -h '.MQTT_HOST.' -t ';
 
 	$input = file_get_contents('php://input');
-	//syslog(LOG_NOTICE, "ispindel " . $input);
 	$data = json_decode($input, true );
+
+	if ($data['temp_units'] == 'K') {
+                $tempC = floatval($data['temperature']) - 273.15;
+        } else if ($data['temp_units'] == 'F') {
+                $tempC = floatval($data['temperature']) / 1.8 - 32;
+        } else {
+                $tempC = floatval($data['temperature']);
+	}
+
+	/* The rounding in the tilt using less digits results in a 0.25 plato difference. Calculate here again using the calibration data. */
+	$tilt = $data['angle'];
+	$plato = (0.00028548 * $tilt * $tilt * $tilt) + (-0.03492272 * $tilt * $tilt) + (1.617106176 * $tilt) + -21.412976092;
+	syslog(LOG_NOTICE, "ispindel " . $input . " plato ".$plato);
+
 	$node = 'ispindel-' . sprintf("%06x", floatval($data['ID']));
 
 	$alarm = 0;
@@ -33,18 +46,10 @@
 	if (floatval($data['battery']) < 3.3)
 		$alarm += 4;
 
-	if ($data['temp_units'] == 'K') {
-		$tempC = floatval($data['temperature']) - 273.15;
-	} else if ($data['temp_units'] == 'F') {
-		$tempC = floatval($data['temperature']) / 1.8 - 32;
-	} else {
-		$tempC = floatval($data['temperature']);
-	}
-
 	$uuid = 'c0ffeeee-cafe-dead-bee0-' . sprintf("%06x", 0xffffff - floatval($data['ID'])) . sprintf("%06x", floatval($data['ID']));
 	$topic = 'mbv1.0/ispindels/DBIRTH/' . $node;
 	$payload  = '{"unit":{"uuid":"' . $uuid .'","alias":"' . $data['name'] . '","alarm":' . $alarm . ',"interval":' . $interval;
-	$payload .= ',"angle":' . $data['angle'] . ',"temperature":' . $tempC . ',"battery":' . $data['battery'] . ',"gravity":' . $data['gravity'] . '}}';
+	$payload .= ',"angle":' . $data['angle'] . ',"temperature":' . $tempC . ',"battery":' . $data['battery'] . ',"gravity":' . $plato . '}}';
 	$pub = $publisher . $topic . ' -m \'' .$payload . '\'';
 	exec($pub);
 }

mercurial