Skip to content

Commit

Permalink
fixed heidi bug
Browse files Browse the repository at this point in the history
  • Loading branch information
StephanSST committed Mar 18, 2024
1 parent 420749f commit 41081da
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 66 deletions.
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ This code will run on a Raspberry PI in a chicken barn. There are scales under t

### Epic v1: Chicken scale recognizes weight change and sends message about state (which chicken, an egg) via Messenger

* fix Heidi bug
* check logs; observer and service log twice
* make ChickenService.initBoxes() resiliant for new Chickens (convert to enum, initBoxes using enum list)
* log messures to file or Prometheus
Expand Down
136 changes: 71 additions & 65 deletions src/main/java/ch/stephan/chickenfarm/timer/ScaleObserver.java
Original file line number Diff line number Diff line change
@@ -1,84 +1,90 @@
package ch.stephan.chickenfarm.timer;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import ch.stephan.chickenfarm.dto.Box;
import ch.stephan.chickenfarm.dto.BoxState;
import ch.stephan.chickenfarm.dto.Chicken;
import ch.stephan.chickenfarm.messenger.MessengerService;
import ch.stephan.chickenfarm.registry.BoxService;
import ch.stephan.chickenfarm.registry.ChickenService;
import ch.stephan.chickenfarm.scale.ScaleService;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Slf4j
@RequiredArgsConstructor
@Component
public class ScaleObserver {

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Autowired
private final BoxService boxService;

@Autowired
private final ScaleService scaleService;

@Autowired
private final MessengerService messengerService;

@Autowired
private final ChickenService chickenService;

@Scheduled(cron = "${schedulerservice.observer.cron}")
public void measureWeights() {
boxService.getBoxes().stream()//
.forEach(this::measureWeightOfScale);
}

private void measureWeightOfScale(Box box) {
int weight = scaleService.measureWeight(box.getId());

if (weight > 1000) { // chicken in the box
Chicken chicken = chickenService.getChicken(weight);
String message = String.format(":chicken: %s sitzt in der Legebox %s und ist %sg schwer.", chicken.name(), box.getDescription(), weight);
log.info(message);

if (box.getBoxState() == BoxState.EMPTY) {
String result = messengerService.sendNotification(message);
log.info("Message sent: {}", result);
box.setBoxState(BoxState.CHICKEN_IN);
}

} else if (weight > 50) { // egg in the box
Chicken chicken = chickenService.getChicken(weight);
String message = String.format(":nest_with_eggs: %s in der Legebox %s hat ein Ei von %sg gelegt.", chicken.name(), box.getDescription(), weight);
log.info(message);

if (box.getBoxState() == BoxState.CHICKEN_IN) {
String result = messengerService.sendNotification(message);
log.info("Message sent: {}", result);
box.setBoxState(BoxState.EGG_IN);
}

} else { // nothing special
if (box.getBoxState() == BoxState.CHICKEN_IN || box.getBoxState() == BoxState.EGG_IN) {
String message = String.format(":empty_nest: Die Legebox %s ist wieder leer.", box.getDescription());
log.info(message);

String result = messengerService.sendNotification(message);
log.info("Message sent: {}", result);
}

log.info("Box {} ({}) with weight {}g at {}", box.getId(), box.getDescription(), weight, dateFormat.format(new Date()));
box.setBoxState(BoxState.EMPTY);
scaleService.tare(box.getId());
}

}
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Autowired
private final BoxService boxService;

@Autowired
private final ScaleService scaleService;

@Autowired
private final MessengerService messengerService;

@Autowired
private final ChickenService chickenService;

@Scheduled(cron = "${schedulerservice.observer.cron}")
public void measureWeights() {
boxService.getBoxes().stream()//
.forEach(this::measureWeightOfScale);
}

private void measureWeightOfScale(Box box) {
int weight = scaleService.measureWeight(box.getId());

if (weight > 1000) { // chicken in the box
Chicken chicken = chickenService.guessChicken(weight);
box.setChicken(chicken);
String message = String.format(":chicken: %s sitzt in der Legebox %s und ist %sg schwer.", chicken.name(),
box.getDescription(), weight);
log.info(message);

if (box.getBoxState() == BoxState.EMPTY) {
String result = messengerService.sendNotification(message);
log.info("Message sent: {}", result);
box.setBoxState(BoxState.CHICKEN_IN);
}

} else if (weight > 50) { // egg in the box
String message = String.format(":nest_with_eggs: %s in der Legebox %s hat ein Ei von %sg gelegt.",
box.getChicken().name(), box.getDescription(), weight);
log.info(message);

if (box.getBoxState() == BoxState.CHICKEN_IN) {
String result = messengerService.sendNotification(message);
log.info("Message sent: {}", result);
box.setBoxState(BoxState.EGG_IN);
}

} else { // nothing special
if (box.getBoxState() == BoxState.CHICKEN_IN || box.getBoxState() == BoxState.EGG_IN) {
String message = String.format(":empty_nest: Die Legebox %s ist wieder leer.", box.getDescription());
log.info(message);

String result = messengerService.sendNotification(message);
log.info("Message sent: {}", result);
}

log.info("Box {} ({}) with weight {}g at {}", box.getId(), box.getDescription(), weight,
dateFormat.format(new Date()));
box.setBoxState(BoxState.EMPTY);
box.setChicken(null);
scaleService.tare(box.getId());
}

}

}

0 comments on commit 41081da

Please sign in to comment.