use of me.retrodaredevil.solarthing.type.alter.AlterPacket in project solarthing by wildmountainfarms.
the class AlterManagerAction method onUpdate.
@Override
protected void onUpdate() {
super.onUpdate();
// Supply queried solarthing_open packets to the security packet receiver, which may execute code to put commands requested to be scheduled in solarthing_alter
List<StoredPacketGroup> packets = openDatabaseCache.getAllCachedPackets();
securityPacketReceiver.receivePacketGroups(packets);
// Check packets in solarthing_alter and see if we need to send a command because of a scheduled command packet
Instant now = Instant.now();
List<VersionedPacket<StoredAlterPacket>> alterPackets = alterPacketsProvider.getPackets();
if (alterPackets == null) {
LOGGER.info("alterPackets is null. Maybe query failed? Maybe additional info in previous logs?");
} else {
for (VersionedPacket<StoredAlterPacket> versionedPacket : alterPackets) {
AlterPacket packet = versionedPacket.getPacket().getPacket();
if (packet instanceof ScheduledCommandPacket) {
ScheduledCommandPacket scheduledCommandPacket = (ScheduledCommandPacket) packet;
ScheduledCommandData data = scheduledCommandPacket.getData();
if (data.getScheduledTimeMillis() <= now.toEpochMilli()) {
if (now.toEpochMilli() - data.getScheduledTimeMillis() > Duration.ofMinutes(5).toMillis()) {
LOGGER.warn("Not going to send a command scheduled for more than 5 minutes ago! data: " + data);
} else {
doSendCommand(versionedPacket, scheduledCommandPacket);
}
}
} else if (packet instanceof FlagPacket) {
FlagPacket flagPacket = (FlagPacket) packet;
FlagData data = flagPacket.getFlagData();
ActivePeriod activePeriod = data.getActivePeriod();
if (activePeriod instanceof TimeRangeActivePeriod) {
// We only try to "manage" flags that use this type of ActivePeriod
TimeRangeActivePeriod period = (TimeRangeActivePeriod) activePeriod;
TimeRange timeRange = period.getTimeRange();
Instant endTime = timeRange.getEndTime();
if (endTime != null && endTime.compareTo(now) < 0) {
// If there is an end time, and it is in the past, then we should remove the flag
executorService.execute(() -> {
try {
database.getAlterDatabase().delete(versionedPacket);
} catch (SolarThingDatabaseException e) {
LOGGER.error("Could not delete a FlagPacket with an expired time", e);
// If we cannot delete it, no need to try again, it'll still be here next time around
}
});
}
}
}
}
}
}
use of me.retrodaredevil.solarthing.type.alter.AlterPacket in project solarthing by wildmountainfarms.
the class FlagUtil method isFlagActive.
public static boolean isFlagActive(Instant now, String flagName, Stream<? extends StoredAlterPacket> packetStream) {
return packetStream.anyMatch(storedAlterPacket -> {
AlterPacket alterPacket = storedAlterPacket.getPacket();
if (alterPacket instanceof FlagPacket) {
FlagPacket flagPacket = (FlagPacket) alterPacket;
FlagData data = flagPacket.getFlagData();
return data.getFlagName().equals(flagName) && data.getActivePeriod().isActive(now);
}
return false;
});
}
use of me.retrodaredevil.solarthing.type.alter.AlterPacket in project solarthing by wildmountainfarms.
the class StatusChatBotHandler method handleMessage.
@Override
public boolean handleMessage(Message message, MessageSender messageSender) {
if (ChatBotUtil.isSimilar("battery voltage", message.getText())) {
FragmentedPacketGroup packetGroup = packetGroupProvider.getPacketGroup();
Float batteryVoltageAverage = BatteryUtil.getBatteryVoltageAverage(packetGroup);
if (batteryVoltageAverage == null) {
messageSender.sendMessage("Battery voltage unavailable from latest data. Sorry!");
} else {
messageSender.sendMessage("Battery voltage: " + Formatting.HUNDREDTHS_FORMAT.format(batteryVoltageAverage));
}
return true;
} else if (ChatBotUtil.isSimilar("battery temperature", message.getText()) || ChatBotUtil.isSimilar("battery temp", message.getText())) {
FragmentedPacketGroup packetGroup = packetGroupProvider.getPacketGroup();
List<String> lines = new ArrayList<>();
for (Packet packet : packetGroup.getPackets()) {
int fragmentId = packetGroup.getFragmentId(packet);
if (packet instanceof BatteryTemperature && packet instanceof Identifiable) {
float temperature = ((BatteryTemperature) packet).getBatteryTemperatureFahrenheit();
IdentityInfo identityInfo = ((Identifiable) packet).getIdentityInfo();
lines.add(identityInfo.getDisplayName() + " (" + fragmentId + "): " + temperature + "F");
}
}
if (lines.isEmpty()) {
messageSender.sendMessage("No devices to read temperature!");
} else {
messageSender.sendMessage(String.join("\n", lines));
}
return true;
} else if (ChatBotUtil.isSimilar("alter", message.getText())) {
List<VersionedPacket<StoredAlterPacket>> alterPackets = alterPacketsProvider.getPackets();
if (alterPackets == null) {
messageSender.sendMessage("Error - Must have failed to query alter database");
} else {
List<String> scheduledCommandLines = new ArrayList<>();
for (VersionedPacket<StoredAlterPacket> versionedPacket : alterPackets) {
StoredAlterPacket storedAlterPacket = versionedPacket.getPacket();
AlterPacket alterPacket = storedAlterPacket.getPacket();
if (alterPacket instanceof ScheduledCommandPacket) {
ScheduledCommandData data = ((ScheduledCommandPacket) alterPacket).getData();
// ExecutionReason executionReason = ((ScheduledCommandPacket) alterPacket).getExecutionReason();
String timeString = TimeUtil.instantToSlackDateSeconds(Instant.ofEpochMilli(data.getScheduledTimeMillis()));
scheduledCommandLines.add(data.getCommandName() + " - " + timeString);
}
}
if (scheduledCommandLines.isEmpty()) {
messageSender.sendMessage("No scheduled commands (from " + alterPackets.size() + " alter packets)");
} else {
messageSender.sendMessage("Scheduled commands:\n\t" + String.join("\n\t", scheduledCommandLines));
}
}
return true;
}
return false;
}
Aggregations