use of me.retrodaredevil.solarthing.solar.common.BatteryTemperature in project solarthing by wildmountainfarms.
the class SolarThingGraphQLFXService method queryFXCharging.
@GraphQLQuery(description = "Gives the timer values for the master FX of a single fragment over a time range")
public List<DataNode<FXChargingPacket>> queryFXCharging(@GraphQLArgument(name = "from") long from, @GraphQLArgument(name = "to") long to, @GraphQLArgument(name = "fragmentId") int fragmentId) {
MetaDatabase metaDatabase = simpleQueryHandler.queryMeta();
FXChargingSettingsPacket fxChargingSettingsPacket = null;
FXChargingTemperatureAdjustPacket fxChargingTemperatureAdjustPacket = null;
for (TargetedMetaPacket targetedMetaPacket : metaDatabase.getMeta(to, fragmentId)) {
if (targetedMetaPacket.getPacketType() == TargetedMetaPacketType.FX_CHARGING_SETTINGS) {
fxChargingSettingsPacket = (FXChargingSettingsPacket) targetedMetaPacket;
} else if (targetedMetaPacket.getPacketType() == TargetedMetaPacketType.FX_CHARGING_TEMPERATURE_ADJUST) {
fxChargingTemperatureAdjustPacket = (FXChargingTemperatureAdjustPacket) targetedMetaPacket;
}
}
if (fxChargingSettingsPacket == null) {
throw new UnexpectedResponseException("Could not find FX Charging settings in meta!");
}
// 3 hours back
long startTime = from - 3 * 60 * 60 * 1000;
List<? extends InstancePacketGroup> packets = simpleQueryHandler.queryStatus(startTime, to, null);
// We make masterIdIgnoreDistance null because we will only be using fragmentId as the master fragment ID
Map<String, List<FragmentedPacketGroup>> map = // separate based on source ID
PacketGroups.sortPackets(packets, simpleQueryHandler.getDefaultInstanceOptions(), SolarThingConstants.STANDARD_MAX_TIME_DISTANCE.toMillis(), null, // make fragmentId be the master ID
FragmentUtil.createPriorityComparator(fragmentId));
List<FragmentedPacketGroup> sortedPackets = null;
for (List<FragmentedPacketGroup> fragmentedPacketGroups : map.values()) {
if (fragmentedPacketGroups.get(0).hasFragmentId(fragmentId)) {
sortedPackets = fragmentedPacketGroups;
break;
}
}
if (sortedPackets == null) {
throw new UnexpectedResponseException("Could not find fragment ID: " + fragmentId);
}
FXChargingSettings settings = fxChargingSettingsPacket.getFXChargingSettings();
FXChargingStateHandler stateHandler = new FXChargingStateHandler(settings);
Long lastUpdate = null;
List<DataNode<FXChargingPacket>> r = new ArrayList<>();
for (FragmentedPacketGroup packetGroup : sortedPackets) {
List<FXStatusPacket> fxPackets = new ArrayList<>();
Integer temperature = null;
for (Packet packet : packetGroup.getPackets()) {
if (packet instanceof FXStatusPacket && packetGroup.getFragmentId(packet) == fragmentId) {
fxPackets.add((FXStatusPacket) packet);
} else if (packet instanceof BatteryTemperature) {
temperature = Math.round(((BatteryTemperature) packet).getBatteryTemperatureCelsius().floatValue());
}
}
if (fxPackets.isEmpty()) {
continue;
}
if (temperature == null) {
// we need temperature data for accurate results // TODO add option for systems that don't use temperature compensation
continue;
}
temperature += fxChargingTemperatureAdjustPacket == null ? 0 : fxChargingTemperatureAdjustPacket.getTemperatureAdjustCelsius();
FXStatusPacket fx = OutbackUtil.getMasterFX(fxPackets);
if (fx == null) {
continue;
}
final long delta;
if (lastUpdate == null) {
delta = 1000;
} else {
delta = packetGroup.getDateMillis() - lastUpdate;
}
lastUpdate = packetGroup.getDateMillis();
stateHandler.update(delta, fx, temperature);
FXChargingPacket fxChargingPacket = new ImmutableFXChargingPacket(fx.getIdentifier(), stateHandler.getMode(), stateHandler.getRemainingAbsorbTimeMillis(), stateHandler.getRemainingFloatTimeMillis(), stateHandler.getRemainingEqualizeTimeMillis(), settings.getAbsorbTimeMillis(), settings.getFloatTimeMillis(), settings.getEqualizeTimeMillis());
r.add(new DataNode<>(fxChargingPacket, fx, packetGroup.getDateMillis(), packetGroup.getSourceId(fx), fragmentId));
}
if (r.isEmpty() && !sortedPackets.isEmpty()) {
throw new UnexpectedResponseException("There must have been no FX packets or no rover packets!");
}
return r;
}
use of me.retrodaredevil.solarthing.solar.common.BatteryTemperature 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