From 40a2554b8827ae9f8a3cd322b016622d317af5fe Mon Sep 17 00:00:00 2001 From: Sebastian Kempken Date: Mon, 10 Feb 2025 07:43:57 +0100 Subject: [PATCH] feat: avm module --- src/app.module.ts | 7 +- src/avm/avm.controller.ts | 8 +-- src/avm/avm.modules.ts | 4 +- src/avm/avm.service.ts | 66 ++++++++++++++++++- .../measurement.entity.ts | 0 src/devices/create-device.dto.ts | 9 +++ src/devices/device.controller.ts | 4 +- src/devices/device.entity.ts | 4 ++ src/devices/device.modules.ts | 6 +- src/devices/device.service.ts | 15 ++--- src/measurement/create-measurement.dto.ts | 34 ---------- src/measurement/measurement.controller.ts | 14 ---- src/measurement/measurement.module.ts | 13 ---- src/measurement/measurement.service.ts | 24 ------- 14 files changed, 96 insertions(+), 112 deletions(-) rename src/{measurement => avm}/measurement.entity.ts (100%) create mode 100644 src/devices/create-device.dto.ts create mode 100644 src/devices/device.entity.ts delete mode 100644 src/measurement/create-measurement.dto.ts delete mode 100644 src/measurement/measurement.controller.ts delete mode 100644 src/measurement/measurement.module.ts delete mode 100644 src/measurement/measurement.service.ts diff --git a/src/app.module.ts b/src/app.module.ts index fc56aa9..7a475e0 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -1,18 +1,17 @@ import { Module } from '@nestjs/common'; import { ServeStaticModule } from '@nestjs/serve-static'; import { join } from 'path'; -import { MeasurementModule } from './measurement/measurement.module'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm'; -import { MeasurementEntity } from './measurement/measurement.entity'; +import { MeasurementEntity } from './avm/measurement.entity'; import { APP_INTERCEPTOR } from '@nestjs/core'; import { HTTPLoggingInterceptor } from './logging-interceptor'; import { DeviceModule } from './devices/device.modules'; import { AvmModule } from './avm/avm.modules'; +import { DeviceEntity } from './devices/device.entity'; @Module({ imports: [ - MeasurementModule, DeviceModule, AvmModule, ServeStaticModule.forRoot({ @@ -28,7 +27,7 @@ import { AvmModule } from './avm/avm.modules'; port: 5432, password: configService.getOrThrow('DB_PW'), username: configService.getOrThrow('DB_USER'), - entities: [MeasurementEntity], + entities: [MeasurementEntity, DeviceEntity], database: configService.getOrThrow('DB_NAME'), synchronize: true, logging: false, diff --git a/src/avm/avm.controller.ts b/src/avm/avm.controller.ts index de7fe37..2d08f1f 100644 --- a/src/avm/avm.controller.ts +++ b/src/avm/avm.controller.ts @@ -1,6 +1,7 @@ import { Controller, Get, Param } from '@nestjs/common'; import { AvmService } from './avm.service'; import { LoginService } from './login.service'; +import { MeasurementEntity } from './measurement.entity'; @Controller('avm/:ain') export class AvmController { @@ -9,9 +10,8 @@ export class AvmController { private readonly loginService: LoginService, ) {} - @Get('energy') - async getEnergy(@Param('ain') ain: string): Promise { - const sid = await this.loginService.getSid(); - return this.avmService.getEnergy(ain, sid); + @Get('measurement') + async getEnergy(@Param('ain') ain: string): Promise { + return this.avmService.getMeasurement(ain); } } diff --git a/src/avm/avm.modules.ts b/src/avm/avm.modules.ts index f0356fe..de1f881 100644 --- a/src/avm/avm.modules.ts +++ b/src/avm/avm.modules.ts @@ -3,9 +3,11 @@ import { AvmController } from './avm.controller'; import { AvmService } from './avm.service'; import { HttpModule } from '@nestjs/axios'; import { LoginService } from './login.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { MeasurementEntity } from './measurement.entity'; @Module({ - imports: [HttpModule], + imports: [HttpModule, TypeOrmModule.forFeature([MeasurementEntity])], controllers: [AvmController], providers: [AvmService, LoginService], exports: [], diff --git a/src/avm/avm.service.ts b/src/avm/avm.service.ts index 6779c57..bd2f165 100644 --- a/src/avm/avm.service.ts +++ b/src/avm/avm.service.ts @@ -1,7 +1,12 @@ import { Injectable, Logger } from '@nestjs/common'; import { HttpService } from '@nestjs/axios'; -import { firstValueFrom, map, Observable } from 'rxjs'; +import { firstValueFrom, map } from 'rxjs'; import { ConfigService } from '@nestjs/config'; +import { MeasurementEntity } from './measurement.entity'; +import { LoginService } from './login.service'; +import { XMLParser } from 'fast-xml-parser'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Repository } from 'typeorm'; @Injectable() export class AvmService { @@ -11,12 +16,30 @@ export class AvmService { constructor( private readonly httpService: HttpService, + private readonly loginService: LoginService, readonly configService: ConfigService, + @InjectRepository(MeasurementEntity) + private measurementRepository: Repository, ) { this.fb = configService.getOrThrow('FB'); } - public async getEnergy(ain: string, sid: string): Promise { + public async getMeasurement(ain: string): Promise { + const sid = await this.loginService.getSid(); + const energy = await this.getEnergy(ain, sid); + const power = await this.getPower(ain, sid); + const temperature = await this.getTemperature(ain, sid); + const voltage = await this.getVoltage(ain, sid); + const parser = new XMLParser(); + const entity = new MeasurementEntity(); + entity.energy = energy; + entity.power = power; + entity.temperature = temperature; + + return entity; + } + + private async getEnergy(ain: string, sid: string): Promise { const request = this.httpService .get(`${this.fb}/${this.endpoint}`, { params: { @@ -25,6 +48,45 @@ export class AvmService { switchcmd: 'getswitchenergy', }, }) + .pipe(map((res) => parseInt(res.data))); + return firstValueFrom(request); + } + + private async getTemperature(ain: string, sid: string): Promise { + const request = this.httpService + .get(`${this.fb}/${this.endpoint}`, { + params: { + sid, + ain, + switchcmd: 'gettemperature', + }, + }) + .pipe(map((res) => parseInt(res.data))); + return firstValueFrom(request); + } + + private async getPower(ain: string, sid: string): Promise { + const request = this.httpService + .get(`${this.fb}/${this.endpoint}`, { + params: { + sid, + ain, + switchcmd: 'getswitchpower', + }, + }) + .pipe(map((res) => parseInt(res.data))); + return firstValueFrom(request); + } + + private async getVoltage(ain: string, sid: string): Promise { + const request = this.httpService + .get(`${this.fb}/${this.endpoint}`, { + params: { + sid, + ain, + switchcmd: 'getdevicelistinfos', + }, + }) .pipe(map((res) => res.data)); return firstValueFrom(request); } diff --git a/src/measurement/measurement.entity.ts b/src/avm/measurement.entity.ts similarity index 100% rename from src/measurement/measurement.entity.ts rename to src/avm/measurement.entity.ts diff --git a/src/devices/create-device.dto.ts b/src/devices/create-device.dto.ts new file mode 100644 index 0000000..60802c8 --- /dev/null +++ b/src/devices/create-device.dto.ts @@ -0,0 +1,9 @@ +import { Type } from 'class-transformer'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class CreateDeviceDto { + @Type(() => String) + @IsString() + @IsNotEmpty() + readonly ain: string; +} diff --git a/src/devices/device.controller.ts b/src/devices/device.controller.ts index b8550b8..416f732 100644 --- a/src/devices/device.controller.ts +++ b/src/devices/device.controller.ts @@ -1,13 +1,13 @@ import { Controller, Get } from '@nestjs/common'; -import { DeviceDto } from './device.dto'; import { DeviceService } from './device.service'; +import { DeviceEntity } from './device.entity'; @Controller('devices') export class DeviceController { constructor(private readonly deviceService: DeviceService) {} @Get() - devices(): Promise { + devices(): Promise { return this.deviceService.getDevices(); } } diff --git a/src/devices/device.entity.ts b/src/devices/device.entity.ts new file mode 100644 index 0000000..c93758b --- /dev/null +++ b/src/devices/device.entity.ts @@ -0,0 +1,4 @@ +import { Entity } from 'typeorm'; + +@Entity({ name: 'devices' }) +export class DeviceEntity {} diff --git a/src/devices/device.modules.ts b/src/devices/device.modules.ts index f0fbfb0..ba4e305 100644 --- a/src/devices/device.modules.ts +++ b/src/devices/device.modules.ts @@ -1,11 +1,11 @@ import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { MeasurementEntity } from '../measurement/measurement.entity'; import { DeviceController } from './device.controller'; import { DeviceService } from './device.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { DeviceEntity } from './device.entity'; @Module({ - imports: [TypeOrmModule.forFeature([MeasurementEntity])], + imports: [TypeOrmModule.forFeature([DeviceEntity])], controllers: [DeviceController], providers: [DeviceService], exports: [], diff --git a/src/devices/device.service.ts b/src/devices/device.service.ts index 1cbcae1..fed5dd1 100644 --- a/src/devices/device.service.ts +++ b/src/devices/device.service.ts @@ -1,23 +1,16 @@ import { Injectable } from '@nestjs/common'; -import { DeviceDto } from './device.dto'; import { InjectRepository } from '@nestjs/typeorm'; -import { MeasurementEntity } from '../measurement/measurement.entity'; import { Repository } from 'typeorm'; +import { DeviceEntity } from './device.entity'; @Injectable() export class DeviceService { constructor( - @InjectRepository(MeasurementEntity) - private measurementRepository: Repository, + @InjectRepository(DeviceEntity) + private deviceRepository: Repository, ) {} - async getDevices(): Promise { - const x = await this.measurementRepository - .createQueryBuilder('measurement') - .select('DISTINCT(device) ain') - .getRawMany(); - console.log(x); - + async getDevices(): Promise { return Promise.resolve([]); } } diff --git a/src/measurement/create-measurement.dto.ts b/src/measurement/create-measurement.dto.ts deleted file mode 100644 index aefdc0d..0000000 --- a/src/measurement/create-measurement.dto.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { Type } from 'class-transformer'; -import { IsNotEmpty, IsNumber, IsString } from 'class-validator'; - -export class CreateMeasurementDto { - @Type(() => String) - @IsString() - @IsNotEmpty() - readonly device: string; - - @Type(() => String) - @IsString() - @IsNotEmpty() - readonly ain: string; - - @Type(() => Number) - @IsNumber() - @IsNotEmpty() - readonly energy: number; - - @Type(() => Number) - @IsNumber() - @IsNotEmpty() - readonly power: number; - - @Type(() => Number) - @IsNumber() - @IsNotEmpty() - readonly temperature: number; - - @Type(() => Number) - @IsNumber() - @IsNotEmpty() - readonly voltage: number; -} diff --git a/src/measurement/measurement.controller.ts b/src/measurement/measurement.controller.ts deleted file mode 100644 index b569321..0000000 --- a/src/measurement/measurement.controller.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Body, Controller, Post } from '@nestjs/common'; -import { MeasurementService } from './measurement.service'; -import { CreateMeasurementDto } from './create-measurement.dto'; -import { MeasurementEntity } from './measurement.entity'; - -@Controller('measurements') -export class MeasurementController { - constructor(private readonly measurementService: MeasurementService) {} - - @Post() - create(@Body() dto: CreateMeasurementDto): Promise { - return this.measurementService.crate(dto); - } -} diff --git a/src/measurement/measurement.module.ts b/src/measurement/measurement.module.ts deleted file mode 100644 index f0ee887..0000000 --- a/src/measurement/measurement.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { MeasurementController } from './measurement.controller'; -import { MeasurementService } from './measurement.service'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { MeasurementEntity } from './measurement.entity'; - -@Module({ - imports: [TypeOrmModule.forFeature([MeasurementEntity])], - controllers: [MeasurementController], - providers: [MeasurementService], - exports: [], -}) -export class MeasurementModule {} diff --git a/src/measurement/measurement.service.ts b/src/measurement/measurement.service.ts deleted file mode 100644 index 724e2f7..0000000 --- a/src/measurement/measurement.service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { CreateMeasurementDto } from './create-measurement.dto'; -import { MeasurementEntity } from './measurement.entity'; -import { InjectRepository } from '@nestjs/typeorm'; -import { Repository } from 'typeorm'; - -@Injectable() -export class MeasurementService { - constructor( - @InjectRepository(MeasurementEntity) - private measurementRepository: Repository, - ) {} - - crate(dto: CreateMeasurementDto): Promise { - const entity = new MeasurementEntity(); - entity.ain = dto.ain; - entity.device = dto.device; - entity.energy = dto.energy; - entity.power = dto.power; - entity.voltage = dto.voltage; - entity.temperature = dto.temperature; - return this.measurementRepository.save(entity); - } -}