From 70f928d961be1f65856039a34b3ede88c0bbc2af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Tue, 7 Nov 2023 08:05:54 +0000 Subject: [PATCH] viele Anpassungen --- .dockerignore | 9 ++++++ .vscode/launch.json | 39 ++++++++++++++++++++++-- actions/data4map.js | 64 +++++++++++++++++++++------------------- actions/getproperties.js | 10 +------ actions/getsensorData.js | 20 +++++++------ bin/www.js | 5 ++-- databases/influx.js | 4 +-- databases/mongo.js | 18 +++++------ doc/Readne.md | 6 ++++ package-lock.json | 4 +-- package.json | 2 +- sensorspecials/noise.js | 27 ++++++++++++----- 12 files changed, 134 insertions(+), 74 deletions(-) create mode 100644 .dockerignore create mode 100644 doc/Readne.md diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4a9fb4f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +build_and_copy.sh +Dockerfile_sensorapi +docker-compose.yml +.vscode +log +mocks +test +node_modules +doc diff --git a/.vscode/launch.json b/.vscode/launch.json index a601cc6..5e20a8e 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,23 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Launch reception", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/bin/www.js", + "env": { + "INFLUXHOST": "192.168.178.190", + "INFLUXTOKEN": "gHGGgjaK0lmM6keMa01JeuDpqOE_vRq8UimsU4QKb2miI5BDh2PfWynEbwKizdJapXy8jVbTat5mVZLQTNmSdw==", + "MONGOHOST": "192.168.178.190", + "MONGOAUTH": "true", + "MONGOUSRP": "admin:mongo4noise", + "DBASE": "influx" + } + }, { "type": "node", "request": "launch", @@ -16,7 +33,7 @@ "INFLUXHOST": "esprimo", "INFLUXTOKEN": "uhsrE9MZtlVD18JnP19y0O0NW9C8HaQV3ElyAT_VwUlreluNsc9rM4djI9H10f6Dcw4oMFUzSngAo9dxtLjUoA==", "MONGOHOST": "esprimo", - "MONGOPORT": "27098" + "MONGOPORT": "27098", } }, { @@ -29,7 +46,25 @@ "program": "${workspaceFolder}/bin/www.js", "env": { "MONGOHOST": "h3006374.stratoserver.net", - "MONGOPORT": "27097" + "MONGOPORT": "27097", + "MONGOAUTH": "true", + "MONGOUSRP": "rxf:Tux4rxf" + } + }, + { + "type": "node", + "request": "launch", + "name": "Launch localhost", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/bin/www.js", + "env": { + "INFLUXHOST": "localhost", + "INFLUXTOKEN": "Pt7cDkKS1pAI2a0qsAhfSY97EVsfeNwJxo-ZdiNvfwC4kBiqxmoj7WbR7XkNRr23YELydv_9HXrN2SMofq9vhQ==", + "MONGOHOST": "localhost", + "MONGOPORT": "27017", + "DEBUG": "sensorapi:*" } } ] diff --git a/actions/data4map.js b/actions/data4map.js index 706c6cc..3a6964f 100644 --- a/actions/data4map.js +++ b/actions/data4map.js @@ -135,40 +135,44 @@ export var getData4map = async (params) => { } let v4map = getValue4Map(typ) for (let sensor of properties) { - let id = sensor._id - const oneAktData = { - location: sensor.location[0].loc.coordinates, - id: sensor._id, - name: sensor.name[0].name, - indoor: sensor.location[0].indoor, - lastseen: sensor.values.timestamp - } - let now = new Date().getTime() - oneAktData.value = -1 - if(oneAktData.lastseen !== '') { - let diff = now - oneAktData.lastseen.getTime() - if (diff >= 365 * 24 * 3600 * 1000) { - oneAktData.value = -4 - } else if (diff >= 30 * 24 * 3600 * 1000) { - oneAktData.value = -3 - } else if (diff >= 7 * 24 * 3600 * 1000) { - oneAktData.value = -2 - } else if (diff >= 2 * 3600 * 1000) { - oneAktData.value = -1 - } else { - if (sensor.values !== undefined) { - oneAktData.value = Math.round(sensor.values[v4map] * 100) / 100 - } + let oneAktData = {} + if (sensor.values !== undefined) { + oneAktData = { + location: sensor.location[0].loc.coordinates, + id: sensor._id, + name: sensor.name[0].name, + indoor: sensor.location[0].indoor, + lastseen: sensor.values.timestamp } - let weeks = Math.round(diff / (7 * 24 * 3600 * 1000)) - oneAktData.weeks = weeks - } - if (sensor.values.timestamp > lastDate) { - lastDate = sensor.values.timestamp + let now = new Date().getTime() + if(oneAktData.lastseen !== '') { + let diff = now - oneAktData.lastseen.getTime() + if (diff >= 365 * 24 * 3600 * 1000) { + oneAktData.value = -4 + } else if (diff >= 30 * 24 * 3600 * 1000) { + oneAktData.value = -3 + } else if (diff >= 7 * 24 * 3600 * 1000) { + oneAktData.value = -2 + } else if (diff >= 2 * 3600 * 1000) { + oneAktData.value = -1 + } else { + if (sensor.values !== undefined) { + oneAktData.value = Math.round(sensor.values[v4map] * 100) / 100 + } + } + let weeks = Math.round(diff / (7 * 24 * 3600 * 1000)) + oneAktData.weeks = weeks + } + if (sensor.values.timestamp > lastDate) { + lastDate = sensor.values.timestamp + } + } else { + oneAktData.value = -5 + oneAktData.weeks = 0 + oneAktData.lastseen = '' } aktData.push(oneAktData) } -// logit(`Query duration: ${start.diffNow('seconds').toObject().seconds * -1} sec`) ret = { err: null, options: { diff --git a/actions/getproperties.js b/actions/getproperties.js index 22e8c91..3edd440 100644 --- a/actions/getproperties.js +++ b/actions/getproperties.js @@ -1,18 +1,10 @@ // Fetch the properties for the given sensor import * as mongo from "../databases/mongo.js" -import * as mock from "../mocks/mongo_mock.js" import {returnOnError} from "../utilities/reporterror.js" import checkParams from "../utilities/checkparams.js" -const mockdb = false - -let readProperties -if (mockdb) { - readProperties = mock.readProperties -} else { - readProperties = mongo.readProperties -} +let readProperties = mongo.readProperties // Read properties for sensorid and properties for all other sensors on same location export const getOneProperty = async (params) => { diff --git a/actions/getsensorData.js b/actions/getsensorData.js index df92cef..88186e7 100644 --- a/actions/getsensorData.js +++ b/actions/getsensorData.js @@ -1,5 +1,6 @@ // get data for one sensor +const DBASE = process.env.DBASE || 'mongo' import {DateTime} from "luxon" import * as influx from "../databases/influx.js" import * as mongo from "../databases/mongo.js" @@ -86,18 +87,18 @@ export const calcRange = (opts) => { let start, end let ret = { start: start, stop: end, err: null} if((opts.datetime === null) || (opts.datetime === undefined) || (opts.datetime === '')) { - start = end = DateTime.local() + start = end = DateTime.local().toUTC() start = start.minus({days: opts.span}) } else { - start = end = DateTime.fromISO(opts.datetime) + start = end = DateTime.fromISO(opts.datetime).toUTC() end = end.plus({days: opts.span}) } if(opts.daystart) { start = start.startOf("day") end = end.startOf("day") } - start = start.toUTC() - end = end.toUTC() +// start = start.toUTC() +// end = end.toUTC() // if(opts.avg !== undefined) { // start = start.minus({minutes: opts.avg}) // } @@ -150,11 +151,12 @@ export async function getSensorData(params) { // export const getActData = async (opts) => { export async function getActData(opts) { -// let retI = await influx.fetchActData(opts) -// retI.mongo = false - let retM = await mongo.fetchActData(opts) - retM.mongo = true - return retM + if (DBASE === 'mongo') { + return await mongo.fetchActData(opts) + } else if (DBASE === 'influx') { + return await influx.fetchActData(opts) + } + return {err: 'DBASEUNKNOWN', values: []} } diff --git a/bin/www.js b/bin/www.js index 53142a1..8588b3d 100644 --- a/bin/www.js +++ b/bin/www.js @@ -5,10 +5,11 @@ */ import app from '../app.js' -import debug from 'debug' +import Debug from 'debug' import http from 'http' -// const debug = 'untitled1:server' +const debug = Debug('sensorapi:*') + /** * Get port from environment and store in Express. */ diff --git a/databases/influx.js b/databases/influx.js index f9db1d9..2b18fbb 100644 --- a/databases/influx.js +++ b/databases/influx.js @@ -9,9 +9,9 @@ import {csv2Json} from "../utilities/csv2json.js"; let INFLUXHOST = process.env.INFLUXHOST || "localhost" let INFLUXPORT = process.env.INFLUXPORT || 8086 -let INFLUXTOKEN = process.env.INFLUXTOKEN || +let INFLUXTOKEN = process.env.INFLUXTOKEN || "" //"rklEClT22KfdXZhA47eyJhbqcvekb8bcKCqlUG7n72uDSmR2xGvif0CmGJe0WQtXB96y29mmt-9BdsgWA5npfg==" - "BNR6cGdb006O1T6hQkGcfB8tgH-UPO6QkOPToeAvrP7LATJbCuWi1wYf3HBpVdZQEBxHxNSrNenZsOSMogX-lg==" + //"BNR6cGdb006O1T6hQkGcfB8tgH-UPO6QkOPToeAvrP7LATJbCuWi1wYf3HBpVdZQEBxHxNSrNenZsOSMogX-lg==" let INFLUXDATABUCKET = process.env.INFLUXDATABUCKET || "sensor_data" let INFLUXORG = process.env.INFLUXORG || "citysensor" diff --git a/databases/mongo.js b/databases/mongo.js index 24fc3c8..54661fd 100644 --- a/databases/mongo.js +++ b/databases/mongo.js @@ -14,23 +14,23 @@ let MONGOUSRP = process.env.MONGOUSRP; let MONGOBASE = process.env.MONGOBASE; if (MONGOHOST === undefined) { MONGOHOST = 'localhost';} -if (MONGOPORT === undefined) { MONGOPORT = 27097; } +if (MONGOPORT === undefined) { MONGOPORT = 27017; } if (MONGOAUTH === undefined) { MONGOAUTH = 'false'; } -if (MONGOBASE === undefined) { MONGOBASE = 'allsensors'; } +if (MONGOBASE === undefined) { MONGOBASE = 'sensor_data'; } let MONGO_URL = 'mongodb://'+MONGOHOST+':'+MONGOPORT; // URL to mongo database if (MONGOAUTH === 'true') { - MONGO_URL = 'mongodb://'+MONGOUSRP+'@' + MONGOHOST + ':' + MONGOPORT + '/?authSource=' + MONGOBASE; // URL to mongo database +// MONGO_URL = 'mongodb://'+MONGOUSRP+'@' + MONGOHOST + ':' + MONGOPORT + '/?authSource=' + MONGOBASE; // URL to mongo database + MONGO_URL = 'mongodb://'+MONGOUSRP+'@' + MONGOHOST + ':' + MONGOPORT + '/?authSource=admin'; // URL to mongo database } -export const properties_collection = 'pptest' +export const properties_collection = 'properties' export const connectMongo = async () => { try { // logit(`Try to connect to ${MONGO_URL}`) -// let client = await MongoClient.connect(MONGO_URL, { useNewUrlParser: true , useUnifiedTopology: true }) let client = await MongoClient.connect(MONGO_URL) - logit(`Mongodbase connected to ${MONGO_URL}`) +// logit(`Mongodbase connected to ${MONGO_URL}`) return client } catch(error){ @@ -104,7 +104,7 @@ export const getOneproperty = async (sid) => { let ret = {error: false} let client = await connectMongo() try { - ret.properties = await client.db(MONGOBASE).collection("properties_collection") + ret.properties = await client.db(MONGOBASE).collection(properties_collection) .findOne({_id: sid}) } catch (e) { ret = {error: true, errortext: e} @@ -154,7 +154,7 @@ export const fetchActData = async (opts) => { let options = { projection: {_id: 0, values: 1, datetime: 1}, sort: {datetime: 1}} let client = await connectMongo() try { - ret.values = await client.db(MONGOBASE).collection('sensors') + ret.values = await client.db(MONGOBASE).collection('noise_sensors') .find(query, options).toArray() } catch(e) { @@ -271,7 +271,7 @@ export const fetchNoiseAVGData = async (opts) => { let grpId = {$dateToString: {format: '%Y-%m-%dT%H:00:00Z', date: '$datetime'}} let client = await connectMongo() try { - docs = await client.db(MONGOBASE).collection('sensors').aggregate([ + docs = await client.db(MONGOBASE).collection('noise_sensors').aggregate([ {$sort: sorting}, // sort by date {$match: datRange}, // select only values in give data range { diff --git a/doc/Readne.md b/doc/Readne.md new file mode 100644 index 0000000..0357693 --- /dev/null +++ b/doc/Readne.md @@ -0,0 +1,6 @@ +# Sensor-API + +### Allgemein +* **ALLE** Zeiten werden in UTC ausgegeben. + Wird beim Aufruf die Zeit im ISO-Format **ohne** Zonenbezeichnung eingegeben, wird sie in UTC umgerechnet und auch so ausgegeben. Wenn die Eingabe schon UTC ist (Z ale letztes Zeichen) dann bleibt es so. + diff --git a/package-lock.json b/package-lock.json index da0a707..eff345c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "sensorapi", - "version": "1.2.2", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sensorapi", - "version": "1.2.2", + "version": "1.3.0", "dependencies": { "@influxdata/influxdb-client": "^1.24.0", "@influxdata/influxdb-client-apis": "^1.24.0", diff --git a/package.json b/package.json index 252be24..8d9d838 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "date": "2023-05-09", "private": true, "scripts": { - "start": "node ./bin/www.js", + "start": "node ./bin/www.js >>/var/log/sensorapi.log 2>&1", "test": "mocha ./test/test.js" }, "type": "module", diff --git a/sensorspecials/noise.js b/sensorspecials/noise.js index 4b5e11d..c6257c6 100644 --- a/sensorspecials/noise.js +++ b/sensorspecials/noise.js @@ -1,5 +1,6 @@ // Data preparation for fetching noise data // rxf 2023-03-05 +const DBASE = process.env.DBASE || 'mongo' import {returnOnError} from "../utilities/reporterror.js"; import { getActData, getAvgData, getLongAvg, calcRange} from "../actions/getsensorData.js" @@ -41,7 +42,7 @@ export const getNoiseData = async (params, possibles, props) => { sid: opts.sensorid, indoor: props.location[0].indoor, span: opts.span, - start: DateTime.fromISO(opts.start.slice(7)), + start: DateTime.fromISO(opts.start.slice(7)).toUTC().toISO(), data: opts.data, peak: opts.peak, count: erg.values.length, @@ -422,8 +423,18 @@ const getAPIprops = (opt) => { } const getNoiseAVGData = async (opts) => { - let retI = await influx.fetchNoiseAVGData(opts) - let ret = await mongo.fetchNoiseAVGData(opts) + let ret + if (DBASE === 'mongo') { + ret = await mongo.fetchNoiseAVGData(opts) + } else if (DBASE === 'influx') { + ret = await influx.fetchNoiseAVGData(opts) + // Influx stores the average from 00:00h to 01:00h as 01:00h, so we have to shift the time 1 hour back + for (let x=0; x < ret.values.length; x++) { + ret.values[x].datetime = DateTime.fromISO(ret.values[x].datetime).toUTC().minus({hours:1}).toISO() + } + } else { + ret.err = 'DBASEUNKNOWN' + } if(ret.err) { return returnOnError(ret, ret.err, getNoiseAVGData.name) @@ -441,19 +452,19 @@ const getNoiseAVGData = async (opts) => { if (opts.long) { emptyValues.n_sum = -1 } - const misshours = DateTime.fromISO(ret.values[0].datetime).get('hour') + const misshours = DateTime.fromISO(ret.values[0].datetime).toUTC().get('hour') let hoursArr = new Array(opts.span * 24 + misshours); // generate new array hoursArr.fill(emptyValues) // fill array with 'empty' values - let startDay = DateTime.fromISO(ret.values[0].datetime).get('day') // calc first day + let startDay = DateTime.fromISO(ret.values[0].datetime).toUTC().get('day') // calc first day let k = 0 for (let d of ret.values) { // loop through docs - let stunde = DateTime.fromISO(d.datetime).get('hour') // get current hour - let day = DateTime.fromISO(d.datetime).get('day') // get current day + let stunde = DateTime.fromISO(d.datetime).toUTC().get('hour') // get current hour + let day = DateTime.fromISO(d.datetime).toUTC().get('day') // get current day if (day != startDay) { // if date has changed k += 24 // increment index by 24 startDay = day } - hoursArr[k+stunde] = d // copy date into hourArray + hoursArr[k + stunde] = d // copy date into hourArray } return { err: ret.err, values: hoursArr} }