From 0b146b5972b7e74bee00e54dc17eb3bbefd045da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20Ha=C3=9Fel?= Date: Wed, 26 Oct 2022 21:04:13 +0200 Subject: [PATCH] #3 FIX Property- & Device updates + Devices in Property::usages + code clean --- .../angular/src/app/api/property/Property.ts | 6 +--- .../device/list/device-list.component.ts | 4 +-- .../list/property-list.component.html | 22 ++++++------ .../property/list/property-list.component.ts | 2 +- .../ph87/homeautomation/StartupService.java | 6 ++-- .../homeautomation/bulk/BulkExecutor.java | 6 ++-- .../channel/ChannelController.java | 8 ++--- ...ChannelService.java => ChannelReader.java} | 10 +++--- .../homeautomation/channel/ChannelWriter.java | 36 +++++++++++++++++++ .../homeautomation/channel/IChannelOwner.java | 2 ++ .../device/DeviceController.java | 24 ++++++------- ...viceReadService.java => DeviceReader.java} | 11 +++--- .../device/DeviceShutterRepository.java | 13 +++++++ .../device/DeviceStateSceneRepository.java | 13 +++++++ .../device/DeviceSwitchRepository.java | 13 +++++++ ...iceWriteService.java => DeviceWriter.java} | 27 +++++++++----- .../homeautomation/knx/KnxThreadService.java | 8 ++--- .../group/KnxGroupChannelOwnerService.java | 19 ++++++---- ...upReadService.java => KnxGroupReader.java} | 2 +- ...pWriteService.java => KnxGroupWriter.java} | 4 +-- .../homeautomation/property/Property.java | 6 ---- .../property/PropertyController.java | 24 ++++++------- .../homeautomation/property/PropertyDto.java | 7 ---- .../property/PropertyMapper.java | 25 ++++++++++--- ...yWriteService.java => PropertyWriter.java} | 14 ++++---- .../schedule/ScheduleExecutor.java | 4 +-- 26 files changed, 202 insertions(+), 114 deletions(-) rename src/main/java/de/ph87/homeautomation/channel/{ChannelService.java => ChannelReader.java} (87%) create mode 100644 src/main/java/de/ph87/homeautomation/channel/ChannelWriter.java rename src/main/java/de/ph87/homeautomation/device/{DeviceReadService.java => DeviceReader.java} (79%) create mode 100644 src/main/java/de/ph87/homeautomation/device/DeviceShutterRepository.java create mode 100644 src/main/java/de/ph87/homeautomation/device/DeviceStateSceneRepository.java create mode 100644 src/main/java/de/ph87/homeautomation/device/DeviceSwitchRepository.java rename src/main/java/de/ph87/homeautomation/device/{DeviceWriteService.java => DeviceWriter.java} (84%) rename src/main/java/de/ph87/homeautomation/knx/group/{KnxGroupReadService.java => KnxGroupReader.java} (96%) rename src/main/java/de/ph87/homeautomation/knx/group/{KnxGroupWriteService.java => KnxGroupWriter.java} (98%) rename src/main/java/de/ph87/homeautomation/property/{PropertyWriteService.java => PropertyWriter.java} (86%) diff --git a/src/main/angular/src/app/api/property/Property.ts b/src/main/angular/src/app/api/property/Property.ts index 18d55b7..ffadb18 100644 --- a/src/main/angular/src/app/api/property/Property.ts +++ b/src/main/angular/src/app/api/property/Property.ts @@ -1,4 +1,4 @@ -import {validateDateAllowNull, validateListOrEmpty, validateNumberAllowNull, validateNumberNotNull, validateStringNotEmptyNotNull} from "../validators"; +import {validateListOrEmpty, validateNumberNotNull, validateStringNotEmptyNotNull} from "../validators"; import {Channel} from "../channel/Channel"; import {SearchResult} from "../SearchResult"; @@ -8,8 +8,6 @@ export class Property { public id: number, public type: string, public title: string, - public value: number | null, - public timestamp: Date | null, public readChannel: Channel | null, public writeChannel: Channel | null, public usages: SearchResult[], @@ -29,8 +27,6 @@ export class Property { validateNumberNotNull(json['id']), validateStringNotEmptyNotNull(json['type']), validateStringNotEmptyNotNull(json['title']), - validateNumberAllowNull(json['value']), - validateDateAllowNull(json['timestamp']), Channel.fromJsonAllowNull(json['readChannel']), Channel.fromJsonAllowNull(json['writeChannel']), validateListOrEmpty(json['usages'], SearchResult.fromJson), diff --git a/src/main/angular/src/app/pages/device/list/device-list.component.ts b/src/main/angular/src/app/pages/device/list/device-list.component.ts index f521ca4..e098dd8 100644 --- a/src/main/angular/src/app/pages/device/list/device-list.component.ts +++ b/src/main/angular/src/app/pages/device/list/device-list.component.ts @@ -74,7 +74,7 @@ export class DeviceListComponent implements OnInit { } getSwitchClassList(device: Device): object { - const value: number | null | undefined = (device as DeviceSwitch).stateProperty?.value; + const value: number | null | undefined = (device as DeviceSwitch).stateProperty?.readChannel?.value; return { switchOn: value === 1, switchOff: value === 0, @@ -87,7 +87,7 @@ export class DeviceListComponent implements OnInit { } getShutterClassList(device: Device): object { - const value: number | null | undefined = (device as DeviceShutter).positionProperty?.value; + const value: number | null | undefined = (device as DeviceShutter).positionProperty?.readChannel?.value; return { shutterOpen: value === 0, shutterBetween: value !== null && value !== undefined && value > 0 && value < 100, diff --git a/src/main/angular/src/app/pages/property/list/property-list.component.html b/src/main/angular/src/app/pages/property/list/property-list.component.html index 9af4652..b2f277c 100644 --- a/src/main/angular/src/app/pages/property/list/property-list.component.html +++ b/src/main/angular/src/app/pages/property/list/property-list.component.html @@ -36,29 +36,29 @@ - - - {{property.value ? "An" : "Aus"}} + + + {{property.readChannel?.value ? "An" : "Aus"}} - - {{property.value}} % + + {{property.readChannel?.value}} % - {{property.value}} % + {{property.readChannel?.value}} % - {{property.value}} K + {{property.readChannel?.value}} K - {{property.value | number:'0.0-0'}} lux + {{property.readChannel?.value | number:'0.0-0'}} lux - {{findScene(property)?.title || "Unbekannt: " + property.value}} + {{findScene(property)?.title || "Unbekannt: " + property.readChannel?.value}} - - {{property.timestamp | date:'yyyy-MM-dd HH:mm:ss'}} + + {{property.readChannel?.timestamp | date:'yyyy-MM-dd HH:mm:ss'}} diff --git a/src/main/angular/src/app/pages/property/list/property-list.component.ts b/src/main/angular/src/app/pages/property/list/property-list.component.ts index 85036a5..cf3e54e 100644 --- a/src/main/angular/src/app/pages/property/list/property-list.component.ts +++ b/src/main/angular/src/app/pages/property/list/property-list.component.ts @@ -72,7 +72,7 @@ export class PropertyListComponent implements OnInit { } findScene(property: Property): Scene | undefined { - return this.scenes.find(s => s.id === property.value); + return this.scenes.find(s => s.id === property.readChannel?.value); } set(property: Property, key: string, value: any): void { diff --git a/src/main/java/de/ph87/homeautomation/StartupService.java b/src/main/java/de/ph87/homeautomation/StartupService.java index 26b66b3..194f2f9 100644 --- a/src/main/java/de/ph87/homeautomation/StartupService.java +++ b/src/main/java/de/ph87/homeautomation/StartupService.java @@ -1,7 +1,7 @@ package de.ph87.homeautomation; import de.ph87.homeautomation.knx.group.KnxGroupImportService; -import de.ph87.homeautomation.property.PropertyWriteService; +import de.ph87.homeautomation.property.PropertyWriter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.event.ApplicationStartedEvent; @@ -17,13 +17,13 @@ public class StartupService { private final DemoDataService demoDataService; - private final PropertyWriteService propertyWriteService; + private final PropertyWriter propertyWriter; @EventListener(ApplicationStartedEvent.class) public void startup() { knxGroupImportService.importGroups(); demoDataService.insertDemoData(); - propertyWriteService.updateAllProperties(); + propertyWriter.updateAllProperties(); } } diff --git a/src/main/java/de/ph87/homeautomation/bulk/BulkExecutor.java b/src/main/java/de/ph87/homeautomation/bulk/BulkExecutor.java index a959a00..6a5355c 100644 --- a/src/main/java/de/ph87/homeautomation/bulk/BulkExecutor.java +++ b/src/main/java/de/ph87/homeautomation/bulk/BulkExecutor.java @@ -1,6 +1,6 @@ package de.ph87.homeautomation.bulk; -import de.ph87.homeautomation.property.PropertyWriteService; +import de.ph87.homeautomation.property.PropertyWriter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor public class BulkExecutor { - private final PropertyWriteService propertyWriteService; + private final PropertyWriter propertyWriter; public void execute(final Bulk bulk) { if (!bulk.isEnabled()) { @@ -20,7 +20,7 @@ public class BulkExecutor { return; } log.info("Executing Bulk: {}", bulk); - bulk.getEntries().forEach(entry -> propertyWriteService.writeToChannel(entry.getProperty(), entry.getValue())); + bulk.getEntries().forEach(entry -> propertyWriter.writeToChannel(entry.getProperty(), entry.getValue())); log.debug("Finished executing Bulk: {}", bulk); } diff --git a/src/main/java/de/ph87/homeautomation/channel/ChannelController.java b/src/main/java/de/ph87/homeautomation/channel/ChannelController.java index 09d703e..60881b1 100644 --- a/src/main/java/de/ph87/homeautomation/channel/ChannelController.java +++ b/src/main/java/de/ph87/homeautomation/channel/ChannelController.java @@ -13,23 +13,23 @@ import java.util.List; @RequiredArgsConstructor public class ChannelController implements ISearchController { - private final ChannelService channelService; + private final ChannelReader channelReader; @GetMapping("findAll") public List findAll() { - return channelService.findAllDto(); + return channelReader.findAllDto(); } @Override @GetMapping("searchById/{id}") public SearchResult searchById(@PathVariable final long id) { - return channelService.findDtoById(id).map(this::toSearchResult).orElseThrow(() -> new NotFoundException("Channel.id=" + id)); + return channelReader.findDtoById(id).map(this::toSearchResult).orElseThrow(() -> new NotFoundException("Channel.id=" + id)); } @Override @PostMapping("searchLike") public List searchLike(@RequestBody final String term) { - return channelService.findAllDtoLike(term).stream().map(this::toSearchResult).toList(); + return channelReader.findAllDtoLike(term).stream().map(this::toSearchResult).toList(); } private SearchResult toSearchResult(final ChannelDto dto) { diff --git a/src/main/java/de/ph87/homeautomation/channel/ChannelService.java b/src/main/java/de/ph87/homeautomation/channel/ChannelReader.java similarity index 87% rename from src/main/java/de/ph87/homeautomation/channel/ChannelService.java rename to src/main/java/de/ph87/homeautomation/channel/ChannelReader.java index ee38670..0241143 100644 --- a/src/main/java/de/ph87/homeautomation/channel/ChannelService.java +++ b/src/main/java/de/ph87/homeautomation/channel/ChannelReader.java @@ -15,7 +15,7 @@ import java.util.Optional; @Service @Transactional @RequiredArgsConstructor -public class ChannelService { +public class ChannelReader { private final List channelOwners; @@ -29,12 +29,12 @@ public class ChannelService { return findByChannel(channel).orElseThrow(RuntimeException::new); } - public void write(final Property property, final double value) { - final Channel channel = property.getWriteChannel(); + public Double read(final Property property) { + final Channel channel = property.getReadChannel(); if (channel == null) { - return; + return null; } - getByChannel(channel).write(property.getWriteChannel().getId(), value); + return getByChannel(channel).read(property.getReadChannel().getId()); } public ChannelDto toDtoAllowNull(final Channel channel) { diff --git a/src/main/java/de/ph87/homeautomation/channel/ChannelWriter.java b/src/main/java/de/ph87/homeautomation/channel/ChannelWriter.java new file mode 100644 index 0000000..6909f9d --- /dev/null +++ b/src/main/java/de/ph87/homeautomation/channel/ChannelWriter.java @@ -0,0 +1,36 @@ +package de.ph87.homeautomation.channel; + +import de.ph87.homeautomation.property.Property; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Slf4j +@Service +@Transactional +@RequiredArgsConstructor +public class ChannelWriter { + + private final List channelOwners; + + public Optional findByChannel(final Channel channel) { + return channelOwners.stream().filter(owner -> channel.getChannelOwnerClass().isInstance(owner)).findFirst(); + } + + public IChannelOwner getByChannel(final Channel channel) { + return findByChannel(channel).orElseThrow(RuntimeException::new); + } + + public void write(final Property property, final double value) { + final Channel channel = property.getWriteChannel(); + if (channel == null) { + return; + } + getByChannel(channel).write(property.getWriteChannel().getId(), value); + } + +} diff --git a/src/main/java/de/ph87/homeautomation/channel/IChannelOwner.java b/src/main/java/de/ph87/homeautomation/channel/IChannelOwner.java index b280f87..b48396d 100644 --- a/src/main/java/de/ph87/homeautomation/channel/IChannelOwner.java +++ b/src/main/java/de/ph87/homeautomation/channel/IChannelOwner.java @@ -6,6 +6,8 @@ public interface IChannelOwner { void requestUpdate(final Channel channel); + Double read(final long id); + void write(final long id, final double value); ChannelDto toDto(final long id); diff --git a/src/main/java/de/ph87/homeautomation/device/DeviceController.java b/src/main/java/de/ph87/homeautomation/device/DeviceController.java index 37f322e..626ca64 100644 --- a/src/main/java/de/ph87/homeautomation/device/DeviceController.java +++ b/src/main/java/de/ph87/homeautomation/device/DeviceController.java @@ -15,60 +15,60 @@ import static de.ph87.homeautomation.shared.Helpers.mapOrNull; @RequiredArgsConstructor public class DeviceController { - private final DeviceReadService deviceReadService; + private final DeviceReader deviceReader; - private final DeviceWriteService deviceWriteService; + private final DeviceWriter deviceWriter; private final PropertyReader propertyReader; @GetMapping("findAll") public List findAll() { - return deviceReadService.findAll(); + return deviceReader.findAll(); } @GetMapping("searchById/{id}") public DeviceDto getById(@PathVariable final long id) { - return deviceReadService.getDtoById(id); + return deviceReader.getDtoById(id); } @PostMapping("create") public DeviceDto create(@RequestBody final String typeString) { - return deviceWriteService.create(typeString); + return deviceWriter.create(typeString); } @GetMapping("delete/{id}") public void delete(@PathVariable final long id) { - deviceWriteService.delete(id); + deviceWriter.delete(id); } @PostMapping("set/{id}/enabled") public DeviceDto setEnabled(@PathVariable final long id, @RequestBody final boolean enabled) { - return deviceWriteService.set(id, Device::setEnabled, enabled); + return deviceWriter.set(id, Device::setEnabled, enabled); } @PostMapping("set/{id}/title") public DeviceDto setName(@PathVariable final long id, @RequestBody final String title) { - return deviceWriteService.set(id, Device::setTitle, title); + return deviceWriter.set(id, Device::setTitle, title); } @PostMapping("set/{id}/DeviceSwitch/stateProperty") public DeviceDto setDeviceSwitchStateProperty(@PathVariable final long id, @RequestBody(required = false) final Long propertyId) { - return deviceWriteService.setDeviceSwitch(id, (device, v) -> device.setStateProperty(mapOrNull(v, propertyReader::getById)), propertyId); + return deviceWriter.setDeviceSwitch(id, (device, v) -> device.setStateProperty(mapOrNull(v, propertyReader::getById)), propertyId); } @PostMapping("set/{id}/DeviceStateScene/stateProperty") public DeviceDto setDeviceStateSceneStateProperty(@PathVariable final long id, @RequestBody(required = false) final Long propertyId) { - return deviceWriteService.setDeviceStateScene(id, (device, v) -> device.setStateProperty(mapOrNull(v, propertyReader::getById)), propertyId); + return deviceWriter.setDeviceStateScene(id, (device, v) -> device.setStateProperty(mapOrNull(v, propertyReader::getById)), propertyId); } @PostMapping("set/{id}/DeviceStateScene/sceneProperty") public DeviceDto setDeviceStateSceneSceneProperty(@PathVariable final long id, @RequestBody(required = false) final Long propertyId) { - return deviceWriteService.setDeviceStateScene(id, (device, v) -> device.setSceneProperty(mapOrNull(v, propertyReader::getById)), propertyId); + return deviceWriter.setDeviceStateScene(id, (device, v) -> device.setSceneProperty(mapOrNull(v, propertyReader::getById)), propertyId); } @PostMapping("set/{id}/DeviceShutter/positionProperty") public DeviceDto setDeviceShutterPositionProperty(@PathVariable final long id, @RequestBody(required = false) final Long propertyId) { - return deviceWriteService.setDeviceShutter(id, (device, v) -> device.setPositionProperty(mapOrNull(v, propertyReader::getById)), propertyId); + return deviceWriter.setDeviceShutter(id, (device, v) -> device.setPositionProperty(mapOrNull(v, propertyReader::getById)), propertyId); } } diff --git a/src/main/java/de/ph87/homeautomation/device/DeviceReadService.java b/src/main/java/de/ph87/homeautomation/device/DeviceReader.java similarity index 79% rename from src/main/java/de/ph87/homeautomation/device/DeviceReadService.java rename to src/main/java/de/ph87/homeautomation/device/DeviceReader.java index d250f53..b325488 100644 --- a/src/main/java/de/ph87/homeautomation/device/DeviceReadService.java +++ b/src/main/java/de/ph87/homeautomation/device/DeviceReader.java @@ -16,7 +16,7 @@ import static de.ph87.homeautomation.shared.Helpers.mapOrNull; @Service @Transactional @RequiredArgsConstructor -public class DeviceReadService { +public class DeviceReader { private final DeviceRepository deviceRepository; @@ -27,14 +27,11 @@ public class DeviceReadService { } public DeviceDto toDto(final Device device) { - if (device instanceof DeviceSwitch) { - final DeviceSwitch deviceSwitch = (DeviceSwitch) device; + if (device instanceof final DeviceSwitch deviceSwitch) { return new DeviceSwitchDto(deviceSwitch, mapOrNull(deviceSwitch.getStateProperty(), propertyMapper::toDto)); - } else if (device instanceof DeviceStateScene) { - final DeviceStateScene deviceStateScene = (DeviceStateScene) device; + } else if (device instanceof final DeviceStateScene deviceStateScene) { return new DeviceStateSceneDto(deviceStateScene, mapOrNull(deviceStateScene.getStateProperty(), propertyMapper::toDto), mapOrNull(deviceStateScene.getSceneProperty(), propertyMapper::toDto)); - } else if (device instanceof DeviceShutter) { - final DeviceShutter deviceShutter = (DeviceShutter) device; + } else if (device instanceof final DeviceShutter deviceShutter) { return new DeviceShutterDto(deviceShutter, mapOrNull(deviceShutter.getPositionProperty(), propertyMapper::toDto)); } throw new RuntimeException(); diff --git a/src/main/java/de/ph87/homeautomation/device/DeviceShutterRepository.java b/src/main/java/de/ph87/homeautomation/device/DeviceShutterRepository.java new file mode 100644 index 0000000..4ef8b5c --- /dev/null +++ b/src/main/java/de/ph87/homeautomation/device/DeviceShutterRepository.java @@ -0,0 +1,13 @@ +package de.ph87.homeautomation.device; + +import de.ph87.homeautomation.device.devices.DeviceShutter; +import de.ph87.homeautomation.property.Property; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface DeviceShutterRepository extends JpaRepository { + + List findDistinctByPositionProperty(Property property); + +} diff --git a/src/main/java/de/ph87/homeautomation/device/DeviceStateSceneRepository.java b/src/main/java/de/ph87/homeautomation/device/DeviceStateSceneRepository.java new file mode 100644 index 0000000..2a3051e --- /dev/null +++ b/src/main/java/de/ph87/homeautomation/device/DeviceStateSceneRepository.java @@ -0,0 +1,13 @@ +package de.ph87.homeautomation.device; + +import de.ph87.homeautomation.device.devices.DeviceStateScene; +import de.ph87.homeautomation.property.Property; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface DeviceStateSceneRepository extends JpaRepository { + + List findDistinctByStatePropertyOrSceneProperty(Property state, Property scene); + +} diff --git a/src/main/java/de/ph87/homeautomation/device/DeviceSwitchRepository.java b/src/main/java/de/ph87/homeautomation/device/DeviceSwitchRepository.java new file mode 100644 index 0000000..d0ffc73 --- /dev/null +++ b/src/main/java/de/ph87/homeautomation/device/DeviceSwitchRepository.java @@ -0,0 +1,13 @@ +package de.ph87.homeautomation.device; + +import de.ph87.homeautomation.device.devices.DeviceSwitch; +import de.ph87.homeautomation.property.Property; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface DeviceSwitchRepository extends JpaRepository { + + List findDistinctByStateProperty(Property property); + +} diff --git a/src/main/java/de/ph87/homeautomation/device/DeviceWriteService.java b/src/main/java/de/ph87/homeautomation/device/DeviceWriter.java similarity index 84% rename from src/main/java/de/ph87/homeautomation/device/DeviceWriteService.java rename to src/main/java/de/ph87/homeautomation/device/DeviceWriter.java index 64db8b2..8c31855 100644 --- a/src/main/java/de/ph87/homeautomation/device/DeviceWriteService.java +++ b/src/main/java/de/ph87/homeautomation/device/DeviceWriter.java @@ -2,6 +2,7 @@ package de.ph87.homeautomation.device; import de.ph87.homeautomation.device.devices.*; import de.ph87.homeautomation.property.Property; +import de.ph87.homeautomation.property.PropertyDto; import de.ph87.homeautomation.scene.SceneDto; import de.ph87.homeautomation.schedule.ScheduleWriter; import de.ph87.homeautomation.web.BadRequestException; @@ -10,22 +11,32 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; import java.util.Arrays; import java.util.function.BiConsumer; +import static de.ph87.homeautomation.shared.Helpers.getCurrentTransactionName; + @Slf4j @Service @Transactional @RequiredArgsConstructor -public class DeviceWriteService { +public class DeviceWriter { private final DeviceRepository deviceRepository; - private final DeviceReadService deviceReadService; + private final DeviceReader deviceReader; private final WebSocketService webSocketService; + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMPLETION) + public void onPropertyChanged(final PropertyDto dto) { + log.debug("Listen [{}]: {}", getCurrentTransactionName(), dto.getTitle()); + // TODO + } + public DeviceDto createDeviceSwitch(final Property stateProperty) { return createDeviceSwitch(null, stateProperty); } @@ -65,13 +76,13 @@ public class DeviceWriteService { } public DeviceDto set(final long id, final BiConsumer setter, final T value) { - final Device device = deviceReadService.getById(id); + final Device device = deviceReader.getById(id); setter.accept(device, value); return publish(device, true); } public DeviceDto setDeviceSwitch(final long id, final BiConsumer setter, final T value) { - final Device device = deviceReadService.getById(id); + final Device device = deviceReader.getById(id); if (!(device instanceof DeviceSwitch)) { throw new BadRequestException("Not a DeviceSwitch: %s", device); } @@ -80,7 +91,7 @@ public class DeviceWriteService { } public DeviceDto setDeviceStateScene(final long id, final BiConsumer setter, final T value) { - final Device device = deviceReadService.getById(id); + final Device device = deviceReader.getById(id); if (!(device instanceof DeviceStateScene)) { throw new BadRequestException("Not a DeviceStateScene: %s", device); } @@ -89,7 +100,7 @@ public class DeviceWriteService { } public DeviceDto setDeviceShutter(final long id, final BiConsumer setter, final T value) { - final Device device = deviceReadService.getById(id); + final Device device = deviceReader.getById(id); if (!(device instanceof DeviceShutter)) { throw new BadRequestException("Not a DeviceShutter: %s", device); } @@ -98,7 +109,7 @@ public class DeviceWriteService { } public void delete(final long id) { - final Device device = deviceReadService.getById(id); + final Device device = deviceReader.getById(id); deviceRepository.delete(device); publish(device, false); } @@ -118,7 +129,7 @@ public class DeviceWriteService { } private DeviceDto publish(final Device device, final boolean existing) { - return publish(deviceReadService.toDto(device), existing); + return publish(deviceReader.toDto(device), existing); } private DeviceDto publish(final DeviceDto dto, final boolean existing) { diff --git a/src/main/java/de/ph87/homeautomation/knx/KnxThreadService.java b/src/main/java/de/ph87/homeautomation/knx/KnxThreadService.java index ae920f0..4d22e5a 100644 --- a/src/main/java/de/ph87/homeautomation/knx/KnxThreadService.java +++ b/src/main/java/de/ph87/homeautomation/knx/KnxThreadService.java @@ -1,7 +1,7 @@ package de.ph87.homeautomation.knx; import de.ph87.homeautomation.knx.group.KnxGroupLinkService; -import de.ph87.homeautomation.knx.group.KnxGroupWriteService; +import de.ph87.homeautomation.knx.group.KnxGroupWriter; import de.ph87.homeautomation.knx.group.KnxThreadWakeUpEvent; import de.ph87.homeautomation.knx.router.Router; import de.ph87.homeautomation.shared.AbstractThreadService; @@ -33,7 +33,7 @@ public class KnxThreadService extends AbstractThreadService implements NetworkLi public static final Duration RESPONSE_TIMEOUT = Duration.ofMillis(500); - private final KnxGroupWriteService knxGroupWriteService; + private final KnxGroupWriter knxGroupWriter; private final KnxGroupLinkService knxGroupLinkService; @@ -135,14 +135,14 @@ public class KnxThreadService extends AbstractThreadService implements NetworkLi @Override public void groupReadResponse(final ProcessEvent processEvent) { synchronized (databaseAccessLock) { - knxGroupWriteService.setReceivedData(processEvent.getDestination(), processEvent.getASDU(), processEvent.getSourceAddr()); + knxGroupWriter.setReceivedData(processEvent.getDestination(), processEvent.getASDU(), processEvent.getSourceAddr()); } } @Override public void groupWrite(final ProcessEvent processEvent) { synchronized (databaseAccessLock) { - knxGroupWriteService.setReceivedData(processEvent.getDestination(), processEvent.getASDU(), processEvent.getSourceAddr()); + knxGroupWriter.setReceivedData(processEvent.getDestination(), processEvent.getASDU(), processEvent.getSourceAddr()); } } diff --git a/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupChannelOwnerService.java b/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupChannelOwnerService.java index 62ffa73..313470f 100644 --- a/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupChannelOwnerService.java +++ b/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupChannelOwnerService.java @@ -15,23 +15,28 @@ import java.util.List; @RequiredArgsConstructor public class KnxGroupChannelOwnerService implements IChannelOwner { - private final KnxGroupWriteService knxGroupWriteService; + private final KnxGroupWriter knxGroupWriter; - private final KnxGroupReadService knxGroupReadService; + private final KnxGroupReader knxGroupReader; @Override public void requestUpdate(final Channel channel) { - knxGroupWriteService.requestRead((KnxGroup) channel); + knxGroupWriter.requestRead((KnxGroup) channel); + } + + @Override + public Double read(final long id) { + return knxGroupReader.getById(id).getValue(); } @Override public void write(final long id, final double value) { - knxGroupWriteService.requestWrite(knxGroupReadService.getById(id), value); + knxGroupWriter.requestWrite(knxGroupReader.getById(id), value); } @Override public KnxGroupDto toDto(final long id) { - return toDto(knxGroupReadService.getById(id)); + return toDto(knxGroupReader.getById(id)); } public KnxGroupDto toDto(final KnxGroup knxGroup) { @@ -40,12 +45,12 @@ public class KnxGroupChannelOwnerService implements IChannelOwner { @Override public List findAllDto() { - return knxGroupReadService.findAll().stream().map(this::toDto).toList(); + return knxGroupReader.findAll().stream().map(this::toDto).toList(); } @Override public List findAllDtoLikeIgnoreCase(final String like) { - return knxGroupReadService.findAllLike(like).stream().map(this::toDto).toList(); + return knxGroupReader.findAllLike(like).stream().map(this::toDto).toList(); } } diff --git a/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupReadService.java b/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupReader.java similarity index 96% rename from src/main/java/de/ph87/homeautomation/knx/group/KnxGroupReadService.java rename to src/main/java/de/ph87/homeautomation/knx/group/KnxGroupReader.java index 40c4ee9..3dd6116 100644 --- a/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupReadService.java +++ b/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupReader.java @@ -13,7 +13,7 @@ import java.util.Optional; @Service @Transactional @RequiredArgsConstructor -public class KnxGroupReadService { +public class KnxGroupReader { private final KnxGroupRepository knxGroupRepository; diff --git a/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriteService.java b/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriter.java similarity index 98% rename from src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriteService.java rename to src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriter.java index aa959c4..ef1f925 100644 --- a/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriteService.java +++ b/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriter.java @@ -21,7 +21,7 @@ import java.util.function.Function; @Service @Transactional @RequiredArgsConstructor -public class KnxGroupWriteService { +public class KnxGroupWriter { private final KnxGroupRepository knxGroupRepository; @@ -43,7 +43,7 @@ public class KnxGroupWriteService { if (translator instanceof DPTXlatorBoolean) { ((DPTXlatorBoolean) translator).setValue(value == 1.0); } else if (translator instanceof DPTXlator8BitUnsigned) { - ((DPTXlator8BitUnsigned) translator).setValue((int) value); + translator.setValue((int) value); } else if (translator instanceof DPTXlatorSceneNumber) { ((DPTXlatorSceneNumber) translator).setValue((int) value - 1); } else { // TODO implement all DPTXlator... diff --git a/src/main/java/de/ph87/homeautomation/property/Property.java b/src/main/java/de/ph87/homeautomation/property/Property.java index a5ab7f1..ef5c4ff 100644 --- a/src/main/java/de/ph87/homeautomation/property/Property.java +++ b/src/main/java/de/ph87/homeautomation/property/Property.java @@ -4,7 +4,6 @@ import de.ph87.homeautomation.channel.Channel; import lombok.*; import javax.persistence.*; -import java.time.ZonedDateTime; @Getter @Setter @@ -25,11 +24,6 @@ public final class Property { @Column(nullable = false, unique = true) private String title; - private ZonedDateTime timestamp; - - @Column(name = "value_") - private Double value; - @ManyToOne private Channel readChannel; diff --git a/src/main/java/de/ph87/homeautomation/property/PropertyController.java b/src/main/java/de/ph87/homeautomation/property/PropertyController.java index a8bbc93..8d8d12a 100644 --- a/src/main/java/de/ph87/homeautomation/property/PropertyController.java +++ b/src/main/java/de/ph87/homeautomation/property/PropertyController.java @@ -1,6 +1,6 @@ package de.ph87.homeautomation.property; -import de.ph87.homeautomation.channel.ChannelService; +import de.ph87.homeautomation.channel.ChannelReader; import de.ph87.homeautomation.shared.ISearchController; import de.ph87.homeautomation.shared.SearchResult; import lombok.RequiredArgsConstructor; @@ -13,15 +13,15 @@ import java.util.List; @RequiredArgsConstructor public class PropertyController implements ISearchController { - private final PropertyWriteService propertyWriteService; + private final PropertyWriter propertyWriter; private final PropertyReader propertyReader; - private final ChannelService channelService; + private final ChannelReader channelReader; @GetMapping("create") public PropertyDto create() { - return propertyWriteService.create(); + return propertyWriter.create(); } @GetMapping("findAll") @@ -31,42 +31,42 @@ public class PropertyController implements ISearchController { @PostMapping("set/{id}/type") public PropertyDto setPropertyType(@PathVariable final long id, @RequestBody final String propertyType) { - return propertyWriteService.set(id, Property::setType, PropertyType.valueOf(propertyType)); + return propertyWriter.set(id, Property::setType, PropertyType.valueOf(propertyType)); } @PostMapping("set/{id}/title") public PropertyDto setPropertyTitle(@PathVariable final long id, @RequestBody final String propertyTitle) { - return propertyWriteService.set(id, Property::setTitle, propertyTitle); + return propertyWriter.set(id, Property::setTitle, propertyTitle); } @PostMapping("set/{id}/value") public PropertyDto setValue(@PathVariable final long id, @RequestBody final double value) { - return propertyWriteService.set(id, propertyWriteService::writeToChannel, value); + return propertyWriter.set(id, propertyWriter::writeToChannel, value); } @PostMapping("set/{id}/readChannel") public PropertyDto setReadChannel(@PathVariable final long id, @RequestBody(required = false) final Long channelId) { - return propertyWriteService.set(id, (p, v) -> p.setReadChannel(channelId == null ? null : channelService.getById(v)), channelId); + return propertyWriter.set(id, (p, v) -> p.setReadChannel(channelId == null ? null : channelReader.getById(v)), channelId); } @PostMapping("set/{id}/writeChannel") public PropertyDto setWriteChannel(@PathVariable final long id, @RequestBody(required = false) final Long channelId) { - return propertyWriteService.set(id, (p, v) -> p.setWriteChannel(channelId == null ? null : channelService.getById(v)), channelId); + return propertyWriter.set(id, (p, v) -> p.setWriteChannel(channelId == null ? null : channelReader.getById(v)), channelId); } @DeleteMapping("{id}") public void delete(@PathVariable final long id) { - propertyWriteService.delete(id); + propertyWriter.delete(id); } @PostMapping("toggle/{id}") public PropertyDto setValue(@PathVariable final long id) { final boolean oldState = getOldStateBoolean(id, false); - return propertyWriteService.set(id, propertyWriteService::writeToChannel, oldState ? 0.0 : 1.0); + return propertyWriter.set(id, propertyWriter::writeToChannel, oldState ? 0.0 : 1.0); } private boolean getOldStateBoolean(final long id, final boolean orElse) { - final Double oldValue = propertyReader.getDtoById(id).getValue(); + final Double oldValue = channelReader.read(propertyReader.getById(id)); if (oldValue == null || oldValue.isNaN()) { return orElse; } diff --git a/src/main/java/de/ph87/homeautomation/property/PropertyDto.java b/src/main/java/de/ph87/homeautomation/property/PropertyDto.java index 8577b47..fbff514 100644 --- a/src/main/java/de/ph87/homeautomation/property/PropertyDto.java +++ b/src/main/java/de/ph87/homeautomation/property/PropertyDto.java @@ -5,7 +5,6 @@ import de.ph87.homeautomation.shared.SearchResult; import lombok.Data; import java.io.Serializable; -import java.time.ZonedDateTime; import java.util.List; @Data @@ -17,10 +16,6 @@ public final class PropertyDto implements Serializable { private final String title; - private final Double value; - - private final ZonedDateTime timestamp; - private final ChannelDto readChannel; private final ChannelDto writeChannel; @@ -31,8 +26,6 @@ public final class PropertyDto implements Serializable { this.id = property.getId(); this.type = property.getType(); this.title = property.getTitle(); - this.value = property.getValue(); - this.timestamp = property.getTimestamp(); this.readChannel = readChannel; this.writeChannel = writeChannel; this.usages = usages; diff --git a/src/main/java/de/ph87/homeautomation/property/PropertyMapper.java b/src/main/java/de/ph87/homeautomation/property/PropertyMapper.java index 7bd271c..60f9140 100644 --- a/src/main/java/de/ph87/homeautomation/property/PropertyMapper.java +++ b/src/main/java/de/ph87/homeautomation/property/PropertyMapper.java @@ -2,7 +2,11 @@ package de.ph87.homeautomation.property; import de.ph87.homeautomation.bulk.Bulk; import de.ph87.homeautomation.bulk.BulkRepository; -import de.ph87.homeautomation.channel.ChannelService; +import de.ph87.homeautomation.channel.ChannelReader; +import de.ph87.homeautomation.device.DeviceShutterRepository; +import de.ph87.homeautomation.device.DeviceStateSceneRepository; +import de.ph87.homeautomation.device.DeviceSwitchRepository; +import de.ph87.homeautomation.device.devices.Device; import de.ph87.homeautomation.schedule.Schedule; import de.ph87.homeautomation.schedule.ScheduleRepository; import de.ph87.homeautomation.shared.SearchResult; @@ -20,18 +24,24 @@ import java.util.List; @RequiredArgsConstructor public class PropertyMapper { - private final ChannelService channelService; + private final ChannelReader channelReader; private final ScheduleRepository scheduleRepository; private final BulkRepository bulkRepository; + private final DeviceSwitchRepository deviceSwitchRepository; + + private final DeviceShutterRepository deviceShutterRepository; + + private final DeviceStateSceneRepository deviceStateSceneRepository; + public PropertyDto toDto(final Property property) { final List usages = findUsages(property); return new PropertyDto( property, - channelService.toDtoAllowNull(property.getReadChannel()), - channelService.toDtoAllowNull(property.getWriteChannel()), + channelReader.toDtoAllowNull(property.getReadChannel()), + channelReader.toDtoAllowNull(property.getWriteChannel()), usages ); } @@ -39,6 +49,9 @@ public class PropertyMapper { private List findUsages(final Property property) { final List searchResults = new ArrayList<>(); searchResults.addAll(scheduleRepository.findDistinctByEntries_Property(property).stream().map(this::toSearchResult).toList()); + searchResults.addAll(deviceSwitchRepository.findDistinctByStateProperty(property).stream().map(this::toSearchResult).toList()); + searchResults.addAll(deviceShutterRepository.findDistinctByPositionProperty(property).stream().map(this::toSearchResult).toList()); + searchResults.addAll(deviceStateSceneRepository.findDistinctByStatePropertyOrSceneProperty(property, property).stream().map(this::toSearchResult).toList()); searchResults.addAll(bulkRepository.findDistinctByEntries_Property(property).stream().map(this::toSearchResult).toList()); return searchResults; } @@ -54,6 +67,10 @@ public class PropertyMapper { return new SearchResult(Schedule.class, schedule.getId(), schedule.getTitle()); } + private SearchResult toSearchResult(final Device device) { + return new SearchResult(Device.class, device.getId(), device.getTitle()); + } + private SearchResult toSearchResult(final Bulk bulk) { return new SearchResult(Bulk.class, bulk.getId(), bulk.getName()); } diff --git a/src/main/java/de/ph87/homeautomation/property/PropertyWriteService.java b/src/main/java/de/ph87/homeautomation/property/PropertyWriter.java similarity index 86% rename from src/main/java/de/ph87/homeautomation/property/PropertyWriteService.java rename to src/main/java/de/ph87/homeautomation/property/PropertyWriter.java index 56fea33..826b664 100644 --- a/src/main/java/de/ph87/homeautomation/property/PropertyWriteService.java +++ b/src/main/java/de/ph87/homeautomation/property/PropertyWriter.java @@ -1,7 +1,7 @@ package de.ph87.homeautomation.property; import de.ph87.homeautomation.channel.ChannelDto; -import de.ph87.homeautomation.channel.ChannelService; +import de.ph87.homeautomation.channel.ChannelWriter; import de.ph87.homeautomation.channel.IChannelOwner; import de.ph87.homeautomation.web.WebSocketService; import lombok.RequiredArgsConstructor; @@ -22,13 +22,13 @@ import static de.ph87.homeautomation.shared.Helpers.getCurrentTransactionName; @Service @Transactional @RequiredArgsConstructor -public class PropertyWriteService { +public class PropertyWriter { private static final String TITLE_PREFIX = "NEU "; private final PropertyReader propertyReader; - private final ChannelService channelService; + private final ChannelWriter channelWriter; private final PropertyMapper propertyMapper; @@ -40,7 +40,7 @@ public class PropertyWriteService { public void updateAllProperties() { propertyReader.findAllByReadChannelNotNull().forEach(property -> { - final Optional ownerOptional = channelService.findByChannel(property.getReadChannel()); + final Optional ownerOptional = channelWriter.findByChannel(property.getReadChannel()); if (ownerOptional.isPresent()) { ownerOptional.get().requestUpdate(property.getReadChannel()); } else { @@ -55,8 +55,6 @@ public class PropertyWriteService { final List properties = propertyReader.findAllByReadChannel_Id(dto.getId()); if (!properties.isEmpty()) { properties.forEach(property -> { - property.setValue(property.getReadChannel().getValue()); - property.setTimestamp(property.getReadChannel().getTimestamp()); log.debug("Updated Property \"{}\" by Channel \"{}\"", property.getTitle(), property.getReadChannel().getName()); publish(property, true); } @@ -65,7 +63,7 @@ public class PropertyWriteService { } public void writeToChannel(final Property property, final double value) { - channelService.write(property, value); + channelWriter.write(property, value); } public PropertyDto create() { @@ -79,7 +77,7 @@ public class PropertyWriteService { int index = 0; String title = null; while (title == null || propertyRepository.existsByTitle(title)) { - title = PropertyWriteService.TITLE_PREFIX + ++index; + title = PropertyWriter.TITLE_PREFIX + ++index; } return title; } diff --git a/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java b/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java index 943c51b..c235b0a 100644 --- a/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java +++ b/src/main/java/de/ph87/homeautomation/schedule/ScheduleExecutor.java @@ -1,7 +1,7 @@ package de.ph87.homeautomation.schedule; import de.ph87.homeautomation.bulk.BulkExecutor; -import de.ph87.homeautomation.property.PropertyWriteService; +import de.ph87.homeautomation.property.PropertyWriter; import de.ph87.homeautomation.schedule.entry.ScheduleEntry; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -19,7 +19,7 @@ public class ScheduleExecutor { private final ScheduleReader scheduleReader; - private final PropertyWriteService propertyWriter; + private final PropertyWriter propertyWriter; private final BulkExecutor bulkExecutor;