viele Anpassungen

This commit is contained in:
2023-11-07 08:05:54 +00:00
parent 91e55f58bf
commit 70f928d961
12 changed files with 134 additions and 74 deletions
+9
View File
@@ -0,0 +1,9 @@
build_and_copy.sh
Dockerfile_sensorapi
docker-compose.yml
.vscode
log
mocks
test
node_modules
doc
+37 -2
View File
@@ -4,6 +4,23 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch reception",
"skipFiles": [
"<node_internals>/**"
],
"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", "type": "node",
"request": "launch", "request": "launch",
@@ -16,7 +33,7 @@
"INFLUXHOST": "esprimo", "INFLUXHOST": "esprimo",
"INFLUXTOKEN": "uhsrE9MZtlVD18JnP19y0O0NW9C8HaQV3ElyAT_VwUlreluNsc9rM4djI9H10f6Dcw4oMFUzSngAo9dxtLjUoA==", "INFLUXTOKEN": "uhsrE9MZtlVD18JnP19y0O0NW9C8HaQV3ElyAT_VwUlreluNsc9rM4djI9H10f6Dcw4oMFUzSngAo9dxtLjUoA==",
"MONGOHOST": "esprimo", "MONGOHOST": "esprimo",
"MONGOPORT": "27098" "MONGOPORT": "27098",
} }
}, },
{ {
@@ -29,7 +46,25 @@
"program": "${workspaceFolder}/bin/www.js", "program": "${workspaceFolder}/bin/www.js",
"env": { "env": {
"MONGOHOST": "h3006374.stratoserver.net", "MONGOHOST": "h3006374.stratoserver.net",
"MONGOPORT": "27097" "MONGOPORT": "27097",
"MONGOAUTH": "true",
"MONGOUSRP": "rxf:Tux4rxf"
}
},
{
"type": "node",
"request": "launch",
"name": "Launch localhost",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/bin/www.js",
"env": {
"INFLUXHOST": "localhost",
"INFLUXTOKEN": "Pt7cDkKS1pAI2a0qsAhfSY97EVsfeNwJxo-ZdiNvfwC4kBiqxmoj7WbR7XkNRr23YELydv_9HXrN2SMofq9vhQ==",
"MONGOHOST": "localhost",
"MONGOPORT": "27017",
"DEBUG": "sensorapi:*"
} }
} }
] ]
+34 -30
View File
@@ -135,40 +135,44 @@ export var getData4map = async (params) => {
} }
let v4map = getValue4Map(typ) let v4map = getValue4Map(typ)
for (let sensor of properties) { for (let sensor of properties) {
let id = sensor._id let oneAktData = {}
const oneAktData = { if (sensor.values !== undefined) {
location: sensor.location[0].loc.coordinates, oneAktData = {
id: sensor._id, location: sensor.location[0].loc.coordinates,
name: sensor.name[0].name, id: sensor._id,
indoor: sensor.location[0].indoor, name: sensor.name[0].name,
lastseen: sensor.values.timestamp 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 weeks = Math.round(diff / (7 * 24 * 3600 * 1000)) let now = new Date().getTime()
oneAktData.weeks = weeks if(oneAktData.lastseen !== '') {
} let diff = now - oneAktData.lastseen.getTime()
if (sensor.values.timestamp > lastDate) { if (diff >= 365 * 24 * 3600 * 1000) {
lastDate = sensor.values.timestamp 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) aktData.push(oneAktData)
} }
// logit(`Query duration: ${start.diffNow('seconds').toObject().seconds * -1} sec`)
ret = { ret = {
err: null, err: null,
options: { options: {
+1 -9
View File
@@ -1,18 +1,10 @@
// Fetch the properties for the given sensor // Fetch the properties for the given sensor
import * as mongo from "../databases/mongo.js" import * as mongo from "../databases/mongo.js"
import * as mock from "../mocks/mongo_mock.js"
import {returnOnError} from "../utilities/reporterror.js" import {returnOnError} from "../utilities/reporterror.js"
import checkParams from "../utilities/checkparams.js" import checkParams from "../utilities/checkparams.js"
const mockdb = false let readProperties = mongo.readProperties
let readProperties
if (mockdb) {
readProperties = mock.readProperties
} else {
readProperties = mongo.readProperties
}
// Read properties for sensorid and properties for all other sensors on same location // Read properties for sensorid and properties for all other sensors on same location
export const getOneProperty = async (params) => { export const getOneProperty = async (params) => {
+11 -9
View File
@@ -1,5 +1,6 @@
// get data for one sensor // get data for one sensor
const DBASE = process.env.DBASE || 'mongo'
import {DateTime} from "luxon" import {DateTime} from "luxon"
import * as influx from "../databases/influx.js" import * as influx from "../databases/influx.js"
import * as mongo from "../databases/mongo.js" import * as mongo from "../databases/mongo.js"
@@ -86,18 +87,18 @@ export const calcRange = (opts) => {
let start, end let start, end
let ret = { start: start, stop: end, err: null} let ret = { start: start, stop: end, err: null}
if((opts.datetime === null) || (opts.datetime === undefined) || (opts.datetime === '')) { if((opts.datetime === null) || (opts.datetime === undefined) || (opts.datetime === '')) {
start = end = DateTime.local() start = end = DateTime.local().toUTC()
start = start.minus({days: opts.span}) start = start.minus({days: opts.span})
} else { } else {
start = end = DateTime.fromISO(opts.datetime) start = end = DateTime.fromISO(opts.datetime).toUTC()
end = end.plus({days: opts.span}) end = end.plus({days: opts.span})
} }
if(opts.daystart) { if(opts.daystart) {
start = start.startOf("day") start = start.startOf("day")
end = end.startOf("day") end = end.startOf("day")
} }
start = start.toUTC() // start = start.toUTC()
end = end.toUTC() // end = end.toUTC()
// if(opts.avg !== undefined) { // if(opts.avg !== undefined) {
// start = start.minus({minutes: opts.avg}) // start = start.minus({minutes: opts.avg})
// } // }
@@ -150,11 +151,12 @@ export async function getSensorData(params) {
// export const getActData = async (opts) => { // export const getActData = async (opts) => {
export async function getActData(opts) { export async function getActData(opts) {
// let retI = await influx.fetchActData(opts) if (DBASE === 'mongo') {
// retI.mongo = false return await mongo.fetchActData(opts)
let retM = await mongo.fetchActData(opts) } else if (DBASE === 'influx') {
retM.mongo = true return await influx.fetchActData(opts)
return retM }
return {err: 'DBASEUNKNOWN', values: []}
} }
+3 -2
View File
@@ -5,10 +5,11 @@
*/ */
import app from '../app.js' import app from '../app.js'
import debug from 'debug' import Debug from 'debug'
import http from 'http' import http from 'http'
// const debug = 'untitled1:server' const debug = Debug('sensorapi:*')
/** /**
* Get port from environment and store in Express. * Get port from environment and store in Express.
*/ */
+2 -2
View File
@@ -9,9 +9,9 @@ import {csv2Json} from "../utilities/csv2json.js";
let INFLUXHOST = process.env.INFLUXHOST || "localhost" let INFLUXHOST = process.env.INFLUXHOST || "localhost"
let INFLUXPORT = process.env.INFLUXPORT || 8086 let INFLUXPORT = process.env.INFLUXPORT || 8086
let INFLUXTOKEN = process.env.INFLUXTOKEN || let INFLUXTOKEN = process.env.INFLUXTOKEN || ""
//"rklEClT22KfdXZhA47eyJhbqcvekb8bcKCqlUG7n72uDSmR2xGvif0CmGJe0WQtXB96y29mmt-9BdsgWA5npfg==" //"rklEClT22KfdXZhA47eyJhbqcvekb8bcKCqlUG7n72uDSmR2xGvif0CmGJe0WQtXB96y29mmt-9BdsgWA5npfg=="
"BNR6cGdb006O1T6hQkGcfB8tgH-UPO6QkOPToeAvrP7LATJbCuWi1wYf3HBpVdZQEBxHxNSrNenZsOSMogX-lg==" //"BNR6cGdb006O1T6hQkGcfB8tgH-UPO6QkOPToeAvrP7LATJbCuWi1wYf3HBpVdZQEBxHxNSrNenZsOSMogX-lg=="
let INFLUXDATABUCKET = process.env.INFLUXDATABUCKET || "sensor_data" let INFLUXDATABUCKET = process.env.INFLUXDATABUCKET || "sensor_data"
let INFLUXORG = process.env.INFLUXORG || "citysensor" let INFLUXORG = process.env.INFLUXORG || "citysensor"
+9 -9
View File
@@ -14,23 +14,23 @@ let MONGOUSRP = process.env.MONGOUSRP;
let MONGOBASE = process.env.MONGOBASE; let MONGOBASE = process.env.MONGOBASE;
if (MONGOHOST === undefined) { MONGOHOST = 'localhost';} if (MONGOHOST === undefined) { MONGOHOST = 'localhost';}
if (MONGOPORT === undefined) { MONGOPORT = 27097; } if (MONGOPORT === undefined) { MONGOPORT = 27017; }
if (MONGOAUTH === undefined) { MONGOAUTH = 'false'; } 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 let MONGO_URL = 'mongodb://'+MONGOHOST+':'+MONGOPORT; // URL to mongo database
if (MONGOAUTH === 'true') { 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 () => { export const connectMongo = async () => {
try { try {
// logit(`Try to connect to ${MONGO_URL}`) // 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) let client = await MongoClient.connect(MONGO_URL)
logit(`Mongodbase connected to ${MONGO_URL}`) // logit(`Mongodbase connected to ${MONGO_URL}`)
return client return client
} }
catch(error){ catch(error){
@@ -104,7 +104,7 @@ export const getOneproperty = async (sid) => {
let ret = {error: false} let ret = {error: false}
let client = await connectMongo() let client = await connectMongo()
try { try {
ret.properties = await client.db(MONGOBASE).collection("properties_collection") ret.properties = await client.db(MONGOBASE).collection(properties_collection)
.findOne({_id: sid}) .findOne({_id: sid})
} catch (e) { } catch (e) {
ret = {error: true, errortext: 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 options = { projection: {_id: 0, values: 1, datetime: 1}, sort: {datetime: 1}}
let client = await connectMongo() let client = await connectMongo()
try { try {
ret.values = await client.db(MONGOBASE).collection('sensors') ret.values = await client.db(MONGOBASE).collection('noise_sensors')
.find(query, options).toArray() .find(query, options).toArray()
} }
catch(e) { catch(e) {
@@ -271,7 +271,7 @@ export const fetchNoiseAVGData = async (opts) => {
let grpId = {$dateToString: {format: '%Y-%m-%dT%H:00:00Z', date: '$datetime'}} let grpId = {$dateToString: {format: '%Y-%m-%dT%H:00:00Z', date: '$datetime'}}
let client = await connectMongo() let client = await connectMongo()
try { try {
docs = await client.db(MONGOBASE).collection('sensors').aggregate([ docs = await client.db(MONGOBASE).collection('noise_sensors').aggregate([
{$sort: sorting}, // sort by date {$sort: sorting}, // sort by date
{$match: datRange}, // select only values in give data range {$match: datRange}, // select only values in give data range
{ {
+6
View File
@@ -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.
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "sensorapi", "name": "sensorapi",
"version": "1.2.2", "version": "1.3.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "sensorapi", "name": "sensorapi",
"version": "1.2.2", "version": "1.3.0",
"dependencies": { "dependencies": {
"@influxdata/influxdb-client": "^1.24.0", "@influxdata/influxdb-client": "^1.24.0",
"@influxdata/influxdb-client-apis": "^1.24.0", "@influxdata/influxdb-client-apis": "^1.24.0",
+1 -1
View File
@@ -4,7 +4,7 @@
"date": "2023-05-09", "date": "2023-05-09",
"private": true, "private": true,
"scripts": { "scripts": {
"start": "node ./bin/www.js", "start": "node ./bin/www.js >>/var/log/sensorapi.log 2>&1",
"test": "mocha ./test/test.js" "test": "mocha ./test/test.js"
}, },
"type": "module", "type": "module",
+19 -8
View File
@@ -1,5 +1,6 @@
// Data preparation for fetching noise data // Data preparation for fetching noise data
// rxf 2023-03-05 // rxf 2023-03-05
const DBASE = process.env.DBASE || 'mongo'
import {returnOnError} from "../utilities/reporterror.js"; import {returnOnError} from "../utilities/reporterror.js";
import { getActData, getAvgData, getLongAvg, calcRange} from "../actions/getsensorData.js" import { getActData, getAvgData, getLongAvg, calcRange} from "../actions/getsensorData.js"
@@ -41,7 +42,7 @@ export const getNoiseData = async (params, possibles, props) => {
sid: opts.sensorid, sid: opts.sensorid,
indoor: props.location[0].indoor, indoor: props.location[0].indoor,
span: opts.span, span: opts.span,
start: DateTime.fromISO(opts.start.slice(7)), start: DateTime.fromISO(opts.start.slice(7)).toUTC().toISO(),
data: opts.data, data: opts.data,
peak: opts.peak, peak: opts.peak,
count: erg.values.length, count: erg.values.length,
@@ -422,8 +423,18 @@ const getAPIprops = (opt) => {
} }
const getNoiseAVGData = async (opts) => { const getNoiseAVGData = async (opts) => {
let retI = await influx.fetchNoiseAVGData(opts) let ret
let ret = await mongo.fetchNoiseAVGData(opts) 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) { if(ret.err) {
return returnOnError(ret, ret.err, getNoiseAVGData.name) return returnOnError(ret, ret.err, getNoiseAVGData.name)
@@ -441,19 +452,19 @@ const getNoiseAVGData = async (opts) => {
if (opts.long) { if (opts.long) {
emptyValues.n_sum = -1 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 let hoursArr = new Array(opts.span * 24 + misshours); // generate new array
hoursArr.fill(emptyValues) // fill array with 'empty' values 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 let k = 0
for (let d of ret.values) { // loop through docs for (let d of ret.values) { // loop through docs
let stunde = DateTime.fromISO(d.datetime).get('hour') // get current hour let stunde = DateTime.fromISO(d.datetime).toUTC().get('hour') // get current hour
let day = DateTime.fromISO(d.datetime).get('day') // get current day let day = DateTime.fromISO(d.datetime).toUTC().get('day') // get current day
if (day != startDay) { // if date has changed if (day != startDay) { // if date has changed
k += 24 // increment index by 24 k += 24 // increment index by 24
startDay = day startDay = day
} }
hoursArr[k+stunde] = d // copy date into hourArray hoursArr[k + stunde] = d // copy date into hourArray
} }
return { err: ret.err, values: hoursArr} return { err: ret.err, values: hoursArr}
} }