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