246 lines
5.8 KiB
TypeScript
246 lines
5.8 KiB
TypeScript
|
|
import { Component, OnInit } from '@angular/core';
|
|
import { ENV } from '../../app.constant';
|
|
import { Geolocation} from '@capacitor/geolocation';
|
|
import { Guid } from "guid-typescript";
|
|
import {interval, Subscription} from 'rxjs';
|
|
import { Storage } from '@ionic/storage-angular';
|
|
import * as Parse from 'parse';
|
|
import { BackgroundMode } from '@awesome-cordova-plugins/background-mode/ngx';
|
|
|
|
// Setup Bluetooth LE
|
|
// Import the wrapper class directly
|
|
|
|
import { BleClient, numbersToDataView, numberToUUID, dataViewToText } from '@capacitor-community/bluetooth-le';
|
|
|
|
|
|
const PM25_SERVICE = 'C8D1D262-861F-4082-947E-F383A259AAF3';
|
|
|
|
const PM25_SERVICE_LCASE= 'c8d1d262-861f-4082-947e-f383a259aaf3';
|
|
|
|
|
|
const PM25_SERVICE_CHARACTERISTIC = 'B0F332A8-A5AA-4F3F-BB43-F99E7791AE01';
|
|
/* other services "B0F332A8-A5AA-4F3F-BB43-F99E7791AE02",
|
|
"B0F332A8-A5AA-4F3F-BB43-F99E7791AE03"
|
|
*/
|
|
|
|
@Component({
|
|
selector: 'app-canairio',
|
|
templateUrl: './canairioco2.page.html',
|
|
styleUrls: ['./canairioco2.page.scss'],
|
|
})
|
|
export class Canairioco2Page implements OnInit {
|
|
public txtco2: string;
|
|
public datetime_ux: string;
|
|
public datetime: Date;
|
|
public latitude: number;
|
|
public longitude: number;
|
|
public altitude: number;
|
|
private parseAppId: string = ENV.parseAppId;
|
|
private parseServerUrl: string = ENV.parseServerUrl;
|
|
private parseJSKey: string=ENV.parseJSKey;
|
|
public result: string;
|
|
public output_json: string;
|
|
public rec_uid: string;
|
|
public session_uid: string;
|
|
|
|
public deviceId:string;
|
|
public intervalID:NodeJS.Timeout;
|
|
public logInterval:number;
|
|
public lblLogstatus: string;
|
|
public allData: any;
|
|
public CO2: string;
|
|
public TEMP: string;
|
|
public HUMID: string;
|
|
public PAX: string;
|
|
public CO2Interpret:string;
|
|
|
|
public ParseServerKey:string;
|
|
public ParseServerURL:string;
|
|
public ParseServerAppID:string;
|
|
|
|
|
|
constructor(private backgroundMode: BackgroundMode) { }
|
|
|
|
|
|
// Initialize Parse SDK and connect to Parse Server
|
|
|
|
|
|
ngOnInit() {
|
|
|
|
this.parseInitialize();
|
|
this.getLocation();
|
|
this.connect();
|
|
this.logInterval=5000;
|
|
this.lblLogstatus="Not logging";
|
|
this.readandSave();
|
|
|
|
this.parseAppId=ENV.parseAppId;
|
|
this.parseServerUrl=ENV.parseServerUrl;
|
|
this.parseJSKey=ENV.parseJSKey;
|
|
|
|
|
|
}
|
|
|
|
// i am not sure if this is needed, because CO2 is not moving
|
|
|
|
async startLogging() {
|
|
|
|
this.backgroundMode.enable();
|
|
|
|
this.lblLogstatus="Logging..";
|
|
// set session uid
|
|
this.session_uid = Guid.raw(); // make it a string
|
|
var str_counter;
|
|
str_counter=0;
|
|
|
|
|
|
this.intervalID = setInterval( () => {
|
|
|
|
|
|
this.lblLogstatus="Logging: " + str_counter.toString() ;
|
|
|
|
str_counter++;
|
|
|
|
this.getLocation();
|
|
this.readandSave();
|
|
|
|
},this.logInterval);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
async stopLogging() {
|
|
clearInterval(this.intervalID);
|
|
this.lblLogstatus="Not logging";
|
|
|
|
this.backgroundMode.disable();
|
|
|
|
|
|
}
|
|
|
|
|
|
async readandSave() {
|
|
|
|
const result = await BleClient.read(this.deviceId, PM25_SERVICE, PM25_SERVICE_CHARACTERISTIC);
|
|
console.log('canair.io result array', dataViewToText(result));
|
|
|
|
this.allData = JSON.parse(dataViewToText(result)); // parse json data and pass json string
|
|
|
|
|
|
|
|
|
|
this.CO2= this.allData['CO2'];
|
|
|
|
|
|
// Indoor CO2 levels
|
|
if (Number(this.CO2)>0 && Number(this.CO2)<700 ) this.CO2Interpret= ("Excellent");
|
|
if (Number(this.CO2)>=700 && Number(this.CO2)<800 )this.CO2Interpret= ("Good");
|
|
if (Number(this.CO2)>=800 && Number(this.CO2)<1000 )this.CO2Interpret= ("Fair");
|
|
if (Number(this.CO2)>=1000 && Number(this.CO2)<1500 )this.CO2Interpret= ("Mediocre");
|
|
if (Number(this.CO2)>=1500 ) this.CO2Interpret= ("Bad");
|
|
|
|
|
|
|
|
this.TEMP= this.allData['tmp'];
|
|
this.HUMID= this.allData['hum'];
|
|
this.PAX= this.allData['PAX'];
|
|
this.CO2= this.allData['CO2'];
|
|
|
|
// lets assume we have
|
|
if (Number(this.CO2)>0) {
|
|
this.TEMP= this.allData['CO2T'];
|
|
this.HUMID= this.allData['CO2H'];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// this.txtco2= this.allData['CO2']; // this is the CO2 value
|
|
|
|
let d = new Date();
|
|
this.datetime=d;
|
|
var unixTimeStamp = Math.floor(d.getTime() / 1000);
|
|
this.datetime_ux=unixTimeStamp.toString();
|
|
this.output_json=dataViewToText(result);
|
|
this.rec_uid = Guid.raw(); // make it a string
|
|
|
|
var Comment = Parse.Object.extend('canairico2_raw_data');
|
|
var canairio_store = new Comment();
|
|
// set initial data record
|
|
canairio_store.set('session_UID',this.session_uid);
|
|
canairio_store.set('record_UID',this.rec_uid);
|
|
canairio_store.set('device_UID',this.deviceId);
|
|
canairio_store.set('output_json',dataViewToText(result));
|
|
canairio_store.set('TEMP',this.TEMP);
|
|
canairio_store.set('HUMID',this.HUMID);
|
|
canairio_store.set('CO2',this.CO2);
|
|
canairio_store.set('PAX',this.PAX);
|
|
canairio_store.set('latitude',this.latitude);
|
|
canairio_store.set('longitude',this.longitude);
|
|
canairio_store.set('altitude',this.altitude);
|
|
canairio_store.set('datetime_ux',this.datetime_ux);
|
|
await canairio_store.save();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get location and save to class variables
|
|
|
|
async getLocation() {
|
|
const position = await Geolocation.getCurrentPosition({enableHighAccuracy: true});
|
|
this.latitude = position.coords.latitude;
|
|
console.log (position.coords.latitude);
|
|
this.longitude = position.coords.longitude;
|
|
this.altitude = position.coords.altitude;
|
|
return position.coords;
|
|
}
|
|
|
|
// connect to parse server and initialize
|
|
|
|
private parseInitialize() {
|
|
|
|
Parse.initialize(this.parseAppId, this.parseJSKey);
|
|
|
|
(Parse as any).serverURL = this.ParseServerURL; // use your server url
|
|
|
|
}
|
|
|
|
|
|
async connect(){
|
|
|
|
try {
|
|
await BleClient.initialize();
|
|
const device = await BleClient.requestDevice({
|
|
namePrefix: 'CanAirIO',
|
|
optionalServices : [PM25_SERVICE_LCASE]
|
|
});
|
|
|
|
// console.log('device', device);
|
|
|
|
await BleClient.connect(device.deviceId);
|
|
console.log('connected to device', device);
|
|
|
|
this.deviceId=device.deviceId;
|
|
this.readandSave();
|
|
|
|
|
|
setTimeout(async () => {
|
|
await BleClient.stopLEScan();
|
|
console.log('stopped scanning');
|
|
}, 5000);
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|