Skip to content

Commit

Permalink
hack to integrate MQTT service
Browse files Browse the repository at this point in the history
  • Loading branch information
StephanSST committed Mar 11, 2024
1 parent d154095 commit 0716617
Show file tree
Hide file tree
Showing 11 changed files with 124 additions and 210 deletions.
6 changes: 0 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,6 @@
<artifactId>spring-integration-mqtt</artifactId>
<version>6.2.2</version>
</dependency>
<!--Tinkerforge libs -->
<dependency>
<groupId>com.tinkerforge</groupId>
<artifactId>tinkerforge</artifactId>
<version>2.1.32</version>
</dependency>
<!--Slack libs -->
<dependency>
<groupId>com.slack.api</groupId>
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/ch/stephan/chickenfarm/dto/Box.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,12 @@
@AllArgsConstructor
@Data
public class Box {
public static final Box VORNE = new Box("ZUw", "vorne", BoxState.EMPTY);
public static final Box HINTEN = new Box("23yp", "hinten", BoxState.EMPTY);
public static final Box VORNE = new Box("2", "vorne", BoxState.EMPTY, 0);
public static final Box HINTEN = new Box("1", "hinten", BoxState.EMPTY, 0);

private String id;
private String description;
private BoxState boxState;
private int weight;

}
6 changes: 3 additions & 3 deletions src/main/java/ch/stephan/chickenfarm/dto/Chicken.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package ch.stephan.chickenfarm.dto;

public record Chicken(String name, int weight) {
public static final Chicken HEIDI = new Chicken("Heidi", 2000);
public static final Chicken KLARA = new Chicken("Klara", 2850);
public static final Chicken LILI = new Chicken("Lili", 2750);
public static final Chicken HEIDI = new Chicken("Heidi", 2200);
public static final Chicken KLARA = new Chicken("Klara", 2850);
public static final Chicken LILI = new Chicken("Lili", 2900);
}
24 changes: 17 additions & 7 deletions src/main/java/ch/stephan/chickenfarm/mqtt/MqttConfig.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ch.stephan.chickenfarm.mqtt;

import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -14,11 +15,19 @@
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;

import ch.stephan.chickenfarm.registry.BoxService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Configuration
@RequiredArgsConstructor
public class MqttConfig {

@Autowired
private BoxService boxService;

@Value("${mqtt.user}")
private String user;

Expand Down Expand Up @@ -56,12 +65,13 @@ MessageProducer inbound() {
@Bean
@ServiceActivator(inputChannel = "mqttInputChannel")
MessageHandler handler() {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
System.out.println("MESSAGE: " + message.getPayload());
}
return message -> handleWeight(message);
}

};
protected void handleWeight(Message<?> message) {
String payload = (String) message.getPayload();
log.info("Current weights: " + payload);
MyMessageHandler.handleWeightMessage(payload, boxService);
}

}
19 changes: 19 additions & 0 deletions src/main/java/ch/stephan/chickenfarm/mqtt/MyMessageHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ch.stephan.chickenfarm.mqtt;

import java.util.StringTokenizer;

import ch.stephan.chickenfarm.registry.BoxService;

public final class MyMessageHandler {

public static void handleWeightMessage(String payload, BoxService boxService) {
StringTokenizer tokenizer = new StringTokenizer(payload, ";");
while (tokenizer.hasMoreTokens()) {
String[] keyValue = tokenizer.nextToken().split(":");
String boxId = keyValue[0].substring(1);
int weight = Float.valueOf(keyValue[1]).intValue();
boxService.getBox(boxId).setWeight(weight);
}
}

}
14 changes: 11 additions & 3 deletions src/main/java/ch/stephan/chickenfarm/registry/BoxService.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package ch.stephan.chickenfarm.registry;

import ch.stephan.chickenfarm.dto.Box;
import jakarta.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import ch.stephan.chickenfarm.dto.Box;
import jakarta.annotation.PostConstruct;

@Service
public class BoxService {

private static List<Box> sBoxes = null;
private static List<Box> sBoxes = null;

public List<Box> getBoxes() {
return sBoxes;
Expand All @@ -22,4 +24,10 @@ public void initBoxes() {
sBoxes.add(Box.VORNE);
}

public Box getBox(String id) {
return sBoxes.stream()//
.filter(b -> b.getId().equals(id))//
.findFirst()//
.orElseThrow(() -> new IllegalArgumentException(String.format("no box with id %s available", id)));
}
}
155 changes: 8 additions & 147 deletions src/main/java/ch/stephan/chickenfarm/scale/ScaleService.java
Original file line number Diff line number Diff line change
@@ -1,175 +1,36 @@
package ch.stephan.chickenfarm.scale;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.tinkerforge.AlreadyConnectedException;
import com.tinkerforge.BrickHAT;
import com.tinkerforge.BrickletLoadCellV2;
import com.tinkerforge.IPConnection;
import com.tinkerforge.NetworkException;
import com.tinkerforge.NotConnectedException;
import com.tinkerforge.TinkerforgeException;

import ch.stephan.chickenfarm.dto.Discovery;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import ch.stephan.chickenfarm.registry.BoxService;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Service
public class ScaleService {

private static final String HOST = "localhost";
private static final int PORT = 4223;

private IPConnection ipConnection;
private List<Discovery> discoveryResult;
EnumerateListenerImpl enumerateListener = new EnumerateListenerImpl();
@Autowired
private BoxService boxService;

public ScaleService() {
super();
}

public ScaleService(IPConnection ipConnection) {
super();
this.ipConnection = ipConnection;
}

public int measureWeight(String uid) {
int weight = -1;
try {
BrickletLoadCellV2 loadCell = new BrickletLoadCellV2(uid, ipConnection);
weight = loadCell.getWeight();
log.info("Scale {} has weight {}g.", uid, weight);

} catch (TinkerforgeException ex) {
ex.printStackTrace();
}

int weight = boxService.getBox(uid).getWeight();
log.info("Scale {} has weight {}g.", uid, weight);
return weight;
}

public String calibrate(String uid) {
try {
BrickletLoadCellV2 loadCell = new BrickletLoadCellV2(uid, ipConnection);
int before = loadCell.getWeight();
loadCell.calibrate(before);
int after = loadCell.getWeight();
log.info("Scale {} was recalibrated. Before: {}g - after: {}g.", uid, before, after);

} catch (TinkerforgeException ex) {
ex.printStackTrace();
}

// log.info("Scale {} was recalibrated. Before: {}g - after: {}g.", uid, before, after);
return "successfully calibrated";
}

public String tare(String uid) {
try {
BrickletLoadCellV2 loadCell = new BrickletLoadCellV2(uid, ipConnection);
loadCell.tare();
log.info("Scale {} has been tared.", uid);

} catch (TinkerforgeException ex) {
ex.printStackTrace();
}

log.info("Scale {} has been tared.", uid);
return "successfully tared";
}

public List<Discovery> discovery() {
try {
discoveryResult = new ArrayList<>();

ipConnection.enumerate();
log.info("Broadcast sent to all connected components");

try {
Thread.sleep(1000);
} catch (InterruptedException ex) {
// just ignore it
}

} catch (TinkerforgeException ex) {
ex.printStackTrace();
}
return discoveryResult;
}

@PostConstruct
public void initIPConnection() {
try {
ipConnection = new IPConnection();
ipConnection.connect(HOST, PORT);
ipConnection.removeEnumerateListener(enumerateListener);
ipConnection.addEnumerateListener(enumerateListener);
} catch (AlreadyConnectedException ex) {
ex.printStackTrace();
} catch (NetworkException ex) {
ex.printStackTrace();
}
}

@PreDestroy
public void shutdownIPConnection() {
try {
ipConnection.disconnect();
ipConnection.close();
} catch (NotConnectedException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}

private final class EnumerateListenerImpl implements IPConnection.EnumerateListener {
@Override
public void enumerate(String uid, String connectedUid, char position, short[] hardwareVersion,
short[] firmwareVersion, int deviceIdentifier, short enumerationType) {

Discovery discovery = new Discovery(deviceAsString(deviceIdentifier), uid, connectedUid,
Character.toString(position), enumAsString(enumerationType), asString(hardwareVersion),
asString(firmwareVersion));
discoveryResult.add(discovery);
}

@Override
public boolean equals(Object obj) {
return obj instanceof EnumerateListenerImpl;
}

private String asString(short[] version) {
return version[0] + "." + version[1] + "." + version[2];
}

private String enumAsString(short enumerationType) {
switch (enumerationType) {
case IPConnection.ENUMERATION_TYPE_AVAILABLE:
return "AVAILABLE";
case IPConnection.ENUMERATION_TYPE_CONNECTED:
return "CONNECTED";
case IPConnection.ENUMERATION_TYPE_DISCONNECTED:
return "DISCONNECTED";
default:
return "UNKNOWN";
}
}

private String deviceAsString(int deviceIdentifier) {
switch (deviceIdentifier) {
case BrickletLoadCellV2.DEVICE_IDENTIFIER:
return "Load Cell V2 Bricklet";
case BrickHAT.DEVICE_IDENTIFIER:
return "HAT Brick";
default:
return String.valueOf(deviceIdentifier);
}
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ public class DiscoveryController {

@GetMapping("/discovery")
public List<Discovery> discovery() {
return scaleService.discovery();
return null; // scaleService.discovery();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ch.stephan.chickenfarm.mqtt;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.junit.jupiter.MockitoExtension;

import ch.stephan.chickenfarm.registry.BoxService;

@ExtendWith(MockitoExtension.class)
class MyMessageHandlerTest {

@InjectMocks
private BoxService boxService;

@BeforeEach
void setUp() throws Exception {
boxService.initBoxes();
}

@Test
void handleWeightMessage() {
String message = "s1:135.45;s2:-153.92";
MyMessageHandler.handleWeightMessage(message, boxService);
assertEquals(135, boxService.getBox("1").getWeight());
assertEquals(-153, boxService.getBox("2").getWeight());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,15 @@

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mock;

import com.tinkerforge.IPConnection;

class ScaleServiceTest {
private static final String UID = UUID.randomUUID().toString();

@Mock
private IPConnection mockedIpConnection;

private ScaleService scaleService;

@BeforeEach
void setUp() {
scaleService = new ScaleService(mockedIpConnection);
scaleService = new ScaleService();
}

@Test
Expand Down
Loading

0 comments on commit 0716617

Please sign in to comment.