85 lines
3.1 KiB
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();
|
|
}
|
|
}
|
|
|
|
}
|