Files
MOBIS_PUBLIC/src/app/mobisplugins/canairioco2/canairioco2.page.ts
Norbert Schmidt 3b3353fff1 Initial commit
2023-01-02 09:30:17 +01:00

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);
}
}
}