Homeautomation/src/main/java/de/ph87/homeautomation/knx/group/KnxGroupWriteService.java

85 lines
3.1 KiB
Java

package de.ph87.homeautomation.knx.group;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import tuwien.auto.calimero.GroupAddress;
import tuwien.auto.calimero.KNXException;
import tuwien.auto.calimero.dptxlator.DPTXlator;
import tuwien.auto.calimero.dptxlator.DPTXlator8BitUnsigned;
import tuwien.auto.calimero.dptxlator.DPTXlatorBoolean;
import tuwien.auto.calimero.dptxlator.TranslatorTypes;
import javax.transaction.Transactional;
import java.time.ZonedDateTime;
import java.util.Objects;
import java.util.Optional;
@Slf4j
@Service
@Transactional(Transactional.TxType.REQUIRES_NEW)
@RequiredArgsConstructor
public class KnxGroupWriteService {
private final KnxGroupRepository knxGroupRepository;
public void updateOrCreate(final int rawAddress, final byte[] data) {
final KnxGroup knxGroup = getOrCreate(rawAddress);
knxGroup.setValue(data);
knxGroup.setValueTimestamp(ZonedDateTime.now());
log.debug("KnxGroup updated: {}", knxGroup);
}
private KnxGroup getOrCreate(final int rawAddress) {
return knxGroupRepository.findByAddressRaw(rawAddress).orElseGet(() -> {
final KnxGroup trans = new KnxGroup();
trans.setAddress(rawAddress);
final KnxGroup saved = knxGroupRepository.save(trans);
log.info("KnxGroup created: {}", saved);
return saved;
});
}
public void markAllForRead() {
knxGroupRepository.findAllByRead_AbleTrue().forEach(knxGroup -> knxGroup.getRead().setNextTimestamp(ZonedDateTime.now()));
}
public void knxGroupCreate(final int main, final int middle, final int sub, final String dpt, final boolean readable) {
final KnxGroup trans = new KnxGroup();
trans.setAddress(main, middle, sub);
trans.setDpt(dpt);
trans.getRead().setAble(readable);
knxGroupRepository.save(trans);
}
public boolean setSendValue(final GroupAddress groupAddress, final String value) {
final Optional<KnxGroup> knxGroupOptional = knxGroupRepository.findByAddressRaw(groupAddress.getRawAddress());
if (knxGroupOptional.isEmpty()) {
return false;
}
final KnxGroup knxGroup = knxGroupOptional.get();
getTranslator(knxGroup, value).ifPresent(translator -> knxGroup.setSendValue(translator.getData()));
knxGroup.getSend().setNextTimestamp(ZonedDateTime.now());
return true;
}
private Optional<DPTXlator> getTranslator(final KnxGroup knxGroup, final String value) {
final int mainNumber = Integer.parseInt(knxGroup.getDpt().split("\\.")[0]);
try {
final DPTXlator translator = TranslatorTypes.createTranslator(mainNumber, knxGroup.getDpt());
if (translator instanceof DPTXlatorBoolean) {
((DPTXlatorBoolean) translator).setValue(Objects.equals(value, "true"));
} else if (translator instanceof DPTXlator8BitUnsigned) {
((DPTXlator8BitUnsigned) translator).setValue(Integer.parseInt(value));
} else {
translator.setValue(value);
}
return Optional.of(translator);
} catch (KNXException e) {
log.error(e.toString());
return Optional.empty();
}
}
}