Mess about with the zapping system & add another secret geojson generator
This commit is contained in:
parent
6844cdc545
commit
a2e4551b75
5 changed files with 73 additions and 12 deletions
|
@ -26,6 +26,7 @@ class Log {
|
||||||
|
|
||||||
func(`${this.a.locol}[${prefix}]${this.a.reset}`, ...items);
|
func(`${this.a.locol}[${prefix}]${this.a.reset}`, ...items);
|
||||||
}
|
}
|
||||||
|
log_e(...items) { this.log_raw(console.error, ...items); }
|
||||||
log(...items) { this.log_raw(console.log, ...items); }
|
log(...items) { this.log_raw(console.log, ...items); }
|
||||||
info(...items) { this.log_raw(console.info, ...items); }
|
info(...items) { this.log_raw(console.info, ...items); }
|
||||||
debug(...items) { this.log_raw(console.debug, ...items); }
|
debug(...items) { this.log_raw(console.debug, ...items); }
|
||||||
|
|
|
@ -36,7 +36,12 @@ class RSSIRepo {
|
||||||
}
|
}
|
||||||
|
|
||||||
iterate() {
|
iterate() {
|
||||||
return this.db.prepare(`SELECT * FROM rssis`).iterate();
|
return this.db.prepare(`SELECT
|
||||||
|
rssis.*,
|
||||||
|
readings.latitude,
|
||||||
|
readings.longitude
|
||||||
|
FROM rssis
|
||||||
|
JOIN readings ON rssis.reading_id = readings.id`).iterate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,16 @@ import show_help from '../help.mjs';
|
||||||
import { decode_payload } from '../ttn-app-server/DecodePayload.mjs';
|
import { decode_payload } from '../ttn-app-server/DecodePayload.mjs';
|
||||||
import path from 'path';
|
import path from 'path';
|
||||||
|
|
||||||
|
import {
|
||||||
|
unnormalise_lat,
|
||||||
|
unnormalise_lng,
|
||||||
|
} from '../../common/Normalisers.mjs'
|
||||||
|
|
||||||
// HACK
|
// HACK
|
||||||
import awilix from 'awilix';
|
import awilix from 'awilix';
|
||||||
|
|
||||||
export default async function(c) {
|
export default async function(c) {
|
||||||
let { ansi: a, log: l, settings } = c.cradle;
|
let { ansi: a, log: l, settings, DatasetFetcher } = c.cradle;
|
||||||
|
|
||||||
// 2: CLI Argument Parsing
|
// 2: CLI Argument Parsing
|
||||||
let args = process.argv.slice(2); // Slice out the node binary name and the filename
|
let args = process.argv.slice(2); // Slice out the node binary name and the filename
|
||||||
|
@ -46,7 +51,7 @@ export default async function(c) {
|
||||||
process.exit();
|
process.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
l.log(`${a.fgreen}${a.hicol}*** LoRaWAN Signal Mapper ***${a.reset}`);
|
l.log_e(`${a.fgreen}${a.hicol}*** LoRaWAN Signal Mapper ***${a.reset}`);
|
||||||
|
|
||||||
switch(extras[0]) {
|
switch(extras[0]) {
|
||||||
case "ttn-app-server":
|
case "ttn-app-server":
|
||||||
|
@ -97,6 +102,32 @@ export default async function(c) {
|
||||||
await ai_trainer.train_all();
|
await ai_trainer.train_all();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "geojson-debug":
|
||||||
|
let result = [];
|
||||||
|
for(let next_item of DatasetFetcher.fetch_all(null, true)) {
|
||||||
|
result.push({
|
||||||
|
type: "Feature",
|
||||||
|
geometry: {
|
||||||
|
type: "Point",
|
||||||
|
coordinates: [
|
||||||
|
unnormalise_lng(next_item.input.longitude),
|
||||||
|
unnormalise_lat(next_item.input.latitude)
|
||||||
|
]
|
||||||
|
},
|
||||||
|
properties: {
|
||||||
|
"marker-symbol": "circle",
|
||||||
|
"marker-color": next_item.output[0] <= 0 ? "#dd0707" : "#04a104",
|
||||||
|
gateway: next_item.ext.gateway,
|
||||||
|
rssi: next_item.ext.rssi_raw
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
console.log(JSON.stringify({
|
||||||
|
type: "FeatureCollection",
|
||||||
|
features: result
|
||||||
|
}, null, "\t"));
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
l.error(`Error: Subcommand '${extras[0]}' not recognised.`);
|
l.error(`Error: Subcommand '${extras[0]}' not recognised.`);
|
||||||
l.error(`Perhaps you mistyped it, or it hasn't been implemented yet?`);
|
l.error(`Perhaps you mistyped it, or it hasn't been implemented yet?`);
|
||||||
|
|
|
@ -63,7 +63,7 @@ devices = [
|
||||||
# The radius around a positive result to zap negative results.
|
# The radius around a positive result to zap negative results.
|
||||||
# This helps to remove false-nagative readings, to improve the AI's ability to
|
# This helps to remove false-nagative readings, to improve the AI's ability to
|
||||||
# accurately predict the actual signal strength.
|
# accurately predict the actual signal strength.
|
||||||
false_negative_zap_radius = 150
|
false_negative_zap_radius = 450
|
||||||
|
|
||||||
# Whether to actually zap false negatives or not.
|
# Whether to actually zap false negatives or not.
|
||||||
# Useful when you want to... erm.... see why the zapping is necessary?
|
# Useful when you want to... erm.... see why the zapping is necessary?
|
||||||
|
|
|
@ -20,12 +20,17 @@ class DatasetFetcher {
|
||||||
this.repo_reading = ReadingRepo;
|
this.repo_reading = ReadingRepo;
|
||||||
}
|
}
|
||||||
|
|
||||||
fetch_all(gateway_id) {
|
fetch_all(gateway_id, extended = false) {
|
||||||
let gateway_location = this.repo_gateway.get_by_id(gateway_id);
|
let gateway_location = this.repo_gateway.get_by_id(gateway_id);
|
||||||
|
|
||||||
|
let iterator = gateway_id == null ? this.repo_rssi.iterate() : this.repo_rssi.iterate_gateway(gateway_id);
|
||||||
let result = [];
|
let result = [];
|
||||||
for(let rssi of this.repo_rssi.iterate_gateway(gateway_id)) {
|
|
||||||
result.push({
|
for(let rssi of iterator) {
|
||||||
|
if(gateway_id == null)
|
||||||
|
gateway_location = this.repo_gateway.get_by_id(rssi.gateway_id);
|
||||||
|
|
||||||
|
let item = {
|
||||||
input: {
|
input: {
|
||||||
latitude: rssi.latitude,
|
latitude: rssi.latitude,
|
||||||
longitude: rssi.longitude,
|
longitude: rssi.longitude,
|
||||||
|
@ -34,24 +39,41 @@ class DatasetFetcher {
|
||||||
output: [
|
output: [
|
||||||
rssi.rssi
|
rssi.rssi
|
||||||
]
|
]
|
||||||
});
|
};
|
||||||
|
if(extended) {
|
||||||
|
item.ext = {
|
||||||
|
gateway: rssi.gateway_id,
|
||||||
|
rssi_raw: rssi.rssi
|
||||||
|
};
|
||||||
|
}
|
||||||
|
result.push(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(let reading of this.repo_reading.iterate_unreceived()) {
|
for(let reading of this.repo_reading.iterate_unreceived()) {
|
||||||
result.push({
|
let item = {
|
||||||
input: {
|
input: {
|
||||||
latitude: reading.latitude,
|
latitude: reading.latitude,
|
||||||
longitude: reading.longitude,
|
longitude: reading.longitude,
|
||||||
distance: haversine(gateway_location, reading)
|
distance: haversine(gateway_location, reading)
|
||||||
},
|
},
|
||||||
output: [ -150 ]
|
output: [ -150 ]
|
||||||
});
|
};
|
||||||
|
if(extended) {
|
||||||
|
item.ext = {
|
||||||
|
gateway: "(none)",
|
||||||
|
rssi_raw: -150
|
||||||
|
};
|
||||||
|
}
|
||||||
|
result.push(item);
|
||||||
}
|
}
|
||||||
shuffle_fisher_yates(result);
|
shuffle_fisher_yates(result);
|
||||||
|
|
||||||
|
console.error("*** Start ***");
|
||||||
if(this.settings.ai.do_zap_false_negatives) {
|
if(this.settings.ai.do_zap_false_negatives) {
|
||||||
|
console.error("Item count before zapping", result.length);
|
||||||
let zap_count = this.zap_false_negatives(result, this.settings.ai.false_negative_zap_radius);
|
let zap_count = this.zap_false_negatives(result, this.settings.ai.false_negative_zap_radius);
|
||||||
this.l.log(`[DatasetFetcher] Zapped ${zap_count} false negatives with a radius of ${this.settings.ai.false_negative_zap_radius}m.`);
|
console.error("Item count after zapping", result.length);
|
||||||
|
this.l.log_e(`[DatasetFetcher] Zapped ${zap_count} false negatives with a radius of ${this.settings.ai.false_negative_zap_radius}m.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
for(let item of result) {
|
for(let item of result) {
|
||||||
|
@ -60,6 +82,8 @@ class DatasetFetcher {
|
||||||
item.input.distance = normalise_gateway_distance(item.input.distance);
|
item.input.distance = normalise_gateway_distance(item.input.distance);
|
||||||
item.output[0] = normalise_rssi(item.output[0]);
|
item.output[0] = normalise_rssi(item.output[0]);
|
||||||
}
|
}
|
||||||
|
console.error("Item count after normalisation", result.length);
|
||||||
|
console.error("*** End ***");
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -91,7 +115,7 @@ class DatasetFetcher {
|
||||||
throw new Error(`Error: Got NaN when checking zapping distance.`);
|
throw new Error(`Error: Got NaN when checking zapping distance.`);
|
||||||
|
|
||||||
if(distance < max_distance_metres) {
|
if(distance < max_distance_metres) {
|
||||||
// console.log(`Zap! (${distance})`);
|
// console.error(`Zap! (${distance})`);
|
||||||
items_to_zap.push(comp_item);
|
items_to_zap.push(comp_item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue