Compare commits

...

4 Commits

13 changed files with 397 additions and 98 deletions

View File

@ -2,6 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.greenwatch">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
@ -9,9 +11,6 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.GreenWatch">
<activity
android:name=".ConnectionActivity"
android:exported="false" />
<activity
android:name=".VideodetectionAndAccelerometerActivity"
android:exported="false" />

View File

@ -75,10 +75,10 @@ public class AccelerometerActivity extends AppCompatActivity implements SensorEv
@Override
public void onChanged(Boolean aBoolean) {
if (aBoolean) {
mAccelerometerViewModel.setDevice(mAccelerometerViewModel.getLocalDeviceUUID(), mAccelerometerViewModel.getSystemTimeStamp(), mAccelerometerViewModel.getLocalDeviceUUID(), true, "Accelerometer", 10);
mAccelerometerViewModel.setDevice(mAccelerometerViewModel.getLocalDeviceUUID(), mAccelerometerViewModel.getSystemTimeStamp(), true, "Accelerometer", 10);
}
else {
mAccelerometerViewModel.setDevice(mAccelerometerViewModel.getLocalDeviceUUID(), mAccelerometerViewModel.getSystemTimeStamp(), mAccelerometerViewModel.getLocalDeviceUUID(), false, "Accelerometer", 0);
mAccelerometerViewModel.setDevice(mAccelerometerViewModel.getLocalDeviceUUID(), mAccelerometerViewModel.getSystemTimeStamp(), false, "Accelerometer", 0);
}
}

View File

@ -1,27 +0,0 @@
package com.example.greenwatch;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class ConnectionActivity extends AppCompatActivity {
private Button backToMainActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_connection);
backToMainActivity = (Button) findViewById(R.id.connectionBackToMainActivity);
backToMainActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
}

View File

@ -3,6 +3,8 @@ package com.example.greenwatch;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.content.Intent;
import android.os.Bundle;
@ -11,6 +13,7 @@ import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.greenwatch.adapters.DeviceListAdapter;
import com.example.greenwatch.models.Device;
import com.example.greenwatch.viewmodels.MainActivityViewModel;
@ -40,11 +43,19 @@ public class MainActivity extends AppCompatActivity {
videodetectionAndAccelerometerButton = (Button) findViewById(R.id.videodetectionAndAccelerometerButton);
connectionButton = (Button) findViewById(R.id.connectionButton);
RecyclerView recyclerView = findViewById(R.id.deviceListRecyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
final DeviceListAdapter deviceListAdapter = new DeviceListAdapter();
recyclerView.setAdapter(deviceListAdapter);
mMainActivityViewModel = new ViewModelProvider(this).get(MainActivityViewModel.class);
mMainActivityViewModel.init();
mMainActivityViewModel.getConnectedDeviceList().observe(this, new Observer<List<Device>>() {
@Override
public void onChanged(List<Device> devices) {
deviceListAdapter.setDevices(devices);
StringBuilder sb = new StringBuilder();
sb.append("Time Stamp: ");
sb.append(mMainActivityViewModel.getTimeStamp(mMainActivityViewModel.getLocalDeviceUUID()));
@ -69,7 +80,7 @@ public class MainActivity extends AppCompatActivity {
@Override
public void onClick(View v) {
//openAudiodetectionActivity();
mMainActivityViewModel.setDevice(mMainActivityViewModel.getLocalDeviceUUID(), "10:51", "12345", false, "Audio", 10);
mMainActivityViewModel.setDevice(mMainActivityViewModel.getLocalDeviceUUID(), "10:51", false, "Audio", 10);
}
});
videodetectionButton.setOnClickListener(new View.OnClickListener() {
@ -78,7 +89,7 @@ public class MainActivity extends AppCompatActivity {
//openVideodetectionActivity();
mMainActivityViewModel.setSensorType(mMainActivityViewModel.getLocalDeviceUUID(), "Video");
mMainActivityViewModel.setTimeStamp(mMainActivityViewModel.getLocalDeviceUUID(), "12:50");
mMainActivityViewModel.setDeviceID(mMainActivityViewModel.getLocalDeviceUUID(), mMainActivityViewModel.getLocalDeviceUUID());
mMainActivityViewModel.setDeviceID(mMainActivityViewModel.getLocalDeviceUUID(), "12345");
}
});
accelerometerButton.setOnClickListener(new View.OnClickListener() {
@ -127,12 +138,14 @@ public class MainActivity extends AppCompatActivity {
startActivity(intent);
}
public void openVideodetectionAndAccelerometerActivity(){
Intent intent = new Intent(this, VideodetectionAndAccelerometerActivity.class);
startActivity(intent);
//Intent intent = new Intent(this, VideodetectionAndAccelerometerActivity.class);
//startActivity(intent);
mMainActivityViewModel.setDevice(mMainActivityViewModel.getLocalDeviceUUID(), "24:00", false, "Video", 0);
}
public void openConnectionActivity(){
Intent intent = new Intent(this, ConnectionActivity.class);
startActivity(intent);
//Intent intent = new Intent(this, ConnectionActivity.class);
//startActivity(intent);
mMainActivityViewModel.setDevice(mMainActivityViewModel.getLocalDeviceUUID(), "10:51", true, "Audio", 10);
}
}

View File

@ -0,0 +1,92 @@
package com.example.greenwatch.adapters;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.greenwatch.R;
import com.example.greenwatch.models.Device;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class DeviceListAdapter extends RecyclerView.Adapter<DeviceListAdapter.DeviceListHolder> {
private List<Device> devices = new ArrayList<>();
@NonNull
@Override
public DeviceListHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.device_item, parent, false);
return new DeviceListHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull DeviceListHolder holder, int position) {
Device currentDevice = devices.get(position);
holder.textViewSensorType.setText(holder.itemView.getContext().getString(R.string.sensor_type_placeholder, currentDevice.getSensorType()));
holder.textViewDeviceID.setText(holder.itemView.getContext().getString(R.string.deviceID_placeholder, currentDevice.getDeviceID()));
holder.textViewTimeStamp.setText(holder.itemView.getContext().getString(R.string.sensor_time_stamp_placeholder, currentDevice.getTimeStamp()));
holder.textViewSensorMessage.setText(holder.itemView.getContext().getString(R.string.sensor_message_placeholder, currentDevice.getSensorMassage()));
holder.setDeviceSensorStatus(currentDevice);
}
@Override
public int getItemCount() {
return devices.size();
}
public void setDevices(List<Device> devices) {
this.devices = devices;
Collections.sort(this.devices, new Comparator<Device>() {
@Override
public int compare(Device device1, Device device2) {
if (device1.getSensorStatus() && !device2.getSensorStatus()) {
return -1;
} else if (!device1.getSensorStatus() && device2.getSensorStatus()) {
return 1;
} else {
return 0;
}
}
});
notifyDataSetChanged();
}
class DeviceListHolder extends RecyclerView.ViewHolder {
private TextView textViewSensorType;
private TextView textViewSensorStatus;
private TextView textViewDeviceID;
private TextView textViewTimeStamp;
private TextView textViewSensorMessage;
public DeviceListHolder(View itemView) {
super(itemView);
textViewSensorType = (TextView) itemView.findViewById(R.id.tvDeviceSensorType);
textViewSensorStatus = (TextView) itemView.findViewById(R.id.tvDeviceSensorStatus);
textViewDeviceID = (TextView) itemView.findViewById(R.id.tvDeviceID);
textViewTimeStamp = (TextView) itemView.findViewById(R.id.tvDeviceTimeStamp);
textViewSensorMessage = (TextView) itemView.findViewById(R.id.tvDeviceSensorMassage);
}
public void setDeviceSensorStatus(Device device) {
if (device.getSensorStatus()) {
textViewSensorStatus.setText(itemView.getContext().getString(R.string.sensor_status_placeholder, "AN"));
itemView.setBackgroundColor(Color.RED);
}
else {
textViewSensorStatus.setText(itemView.getContext().getString(R.string.sensor_status_placeholder, "AUS"));
itemView.setBackgroundColor(Color.WHITE);
}
}
}
}

View File

@ -0,0 +1,133 @@
package com.example.greenwatch.communication;
import com.example.greenwatch.repositories.DeviceRepository;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;
public class WiFiCommunication {
private final InetAddress address;
private final DatagramSocket socket;
private final int port;
private String rxString;
private String sendMessage;
//private String sendMsg = "default";
private boolean isNewMessage;
volatile private boolean running;
private static WiFiCommunication wifiCommunicationInstance;
private DeviceRepository mDeviceRepository;
private WiFiCommunication() {
port = 1234;
try {
socket = new DatagramSocket(port);
socket.setBroadcast(true);
address = InetAddress.getByName("255.255.255.255");
running = true;
isNewMessage = false;
new ReceiveThread().start();
new SendThread().start();
} catch (SocketException | UnknownHostException e) {
throw new RuntimeException(e);
}
}
public static synchronized WiFiCommunication getInstance() {
if (wifiCommunicationInstance == null){
wifiCommunicationInstance = new WiFiCommunication();
}
return wifiCommunicationInstance;
}
public void setDeviceRepository(DeviceRepository deviceRepository) {
this.mDeviceRepository = deviceRepository;
}
public void setNewMessage(String newMessage, boolean isNewMessage){
this.sendMessage = newMessage;
this.isNewMessage = isNewMessage;
}
public static String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface networkInterface = (NetworkInterface) ((Enumeration<?>) en).nextElement();
for (Enumeration<InetAddress> addresses = networkInterface.getInetAddresses(); addresses.hasMoreElements();) {
InetAddress inetAddress = addresses.nextElement();
if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) {
return inetAddress.getHostAddress();
}
}
}
} catch (SocketException ex) {
ex.printStackTrace();
}
return null;
}
public void stopCommunication() {
running = false;
socket.close();
}
private class SendThread extends Thread {
private int tmpCnt = 0;
@Override
public void run() {
try {
do {
if(isNewMessage)
{
isNewMessage = false;
//todo: adapt send String
String txString = getLocalIpAddress() + " sends. #" + tmpCnt++ + sendMessage;
byte[] txBuffer = txString.getBytes();
DatagramPacket txPacket = new DatagramPacket(txBuffer, txBuffer.length, address, port);
for(int i = 0; i < 20; i++) {
socket.send(txPacket);
}
}
} while (running);
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ReceiveThread extends Thread {
private String rxString = "";
private String previousRxString = "";
@Override
public void run() {
try {
do {
byte[] rxBuffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(rxBuffer, rxBuffer.length);
socket.receive(packet);
rxString = new String(packet.getData(), 0, packet.getLength());
if(!previousRxString.equals(rxString)){
mDeviceRepository.getNewReceivedMessage(rxString);
}
previousRxString = rxString;
} while (running);
}
catch (IOException e) {
e.printStackTrace();
}
}
}
}

View File

@ -4,6 +4,7 @@ package com.example.greenwatch.repositories;
import androidx.lifecycle.MutableLiveData;
import com.example.greenwatch.models.Device;
import com.example.greenwatch.communication.WiFiCommunication;
import java.util.ArrayList;
import java.util.HashMap;
@ -12,21 +13,30 @@ import java.util.UUID;
public class DeviceRepository {
private String delimiter = ", ";
private String deviceUUID;
private final String delimiter = ", ";
private final String SensorStatusKey = "An";
private String localDeviceUUID;
private static DeviceRepository deviceRepositoryInstance;
private WiFiCommunication mWiFiCommunication;
private MutableLiveData<List<Device>> deviceList = new MutableLiveData<>();
private HashMap<String, Device> connectedDevicesList = new HashMap<>();
private HashMap<String, String> deviceIDMapper = new HashMap<>();
private DeviceRepository() {
setLocalDeviceUUID();
}
public static synchronized DeviceRepository getInstance() {
if (deviceRepositoryInstance == null){
deviceRepositoryInstance = new DeviceRepository();
deviceRepositoryInstance.setDeviceUUID();
}
return deviceRepositoryInstance;
}
public void setWiFiCommunication(WiFiCommunication wiFiCommunication) {
this.mWiFiCommunication = wiFiCommunication;
}
public MutableLiveData<List<Device>> getConnectedDeviceList() {
setMutableLiveDataValue();
return deviceList;
@ -34,24 +44,12 @@ public class DeviceRepository {
public void createNewDevice(String timeStamp, String deviceID, boolean sensorStatus, String sensorType, int sensorMassage){
Device newDevice = new Device(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage);
setDeviceIDMapper(deviceID);
addToConnectedDeviceList(newDevice.getDeviceID(), newDevice);
setMutableLiveDataValue();
}
public void createNewRemoteDevice(String message) {
String[] messageString = messageStringSplitter(message);
String timeStamp = messageString[0];
String deviceID = messageString[1];
boolean sensorStatus = Boolean.valueOf(messageString[1]);
String sensorType = messageString[3];
int sensorMassage = Integer.valueOf(messageString[4]);
if(!connectedDevicesList.containsKey(deviceID)) {
createNewDevice(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage);
}
}
public String messageStringBuilder(String deviceID) {
private String messageStringBuilder(String deviceID) {
StringBuilder message = new StringBuilder();
Device device = connectedDevicesList.get(deviceID);
if(device != null) {
@ -66,25 +64,33 @@ public class DeviceRepository {
.append(device.getSensorMassage());
return message.toString();
}
return message.toString();
else {
message.append("")
.append(delimiter)
.append("")
.append(delimiter)
.append("")
.append(delimiter)
.append("")
.append(delimiter)
.append("");
return message.toString();
}
}
public String getLocalDeviceUUID() {
return deviceUUID;
return localDeviceUUID;
}
public void setDevice(String deviceID, String timeStamp, String newDeviceID, boolean sensorStatus, String sensorType, int sensorMassage) {
public void updateDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
String checkedDeviceID = checkDeviceID(deviceID);
Device device = connectedDevicesList.get(checkedDeviceID);
if(device != null) {
device.setTimeStamp(timeStamp);
device.setDeviceID(newDeviceID);
device.setSensorStatus(sensorStatus);
device.setSensorType(sensorType);
device.setSensorMassage(sensorMassage);
setDeviceIDMapper(newDeviceID);
connectedDevicesList.remove(checkedDeviceID);
addToConnectedDeviceList(newDeviceID, device);
addToConnectedDeviceList(checkedDeviceID, device);
setMutableLiveDataValue();
}
}
@ -193,24 +199,51 @@ public class DeviceRepository {
private void addToConnectedDeviceList(String key, Device device) {
connectedDevicesList.put(key, device);
if (key.equals(checkDeviceID(localDeviceUUID))) {
mWiFiCommunication.setNewMessage(messageStringBuilder(device.getDeviceID()),true);
}
}
private String checkDeviceID(String deviceID) {
if(!deviceIDMapper.isEmpty() && deviceID.equals(deviceUUID)) {
if(!deviceIDMapper.isEmpty() && deviceID.equals(localDeviceUUID)) {
return deviceIDMapper.get(deviceID);
}
return deviceID;
}
private void setDeviceIDMapper(String deviceID) {
deviceIDMapper.put(deviceUUID, deviceID);
deviceIDMapper.put(localDeviceUUID, deviceID);
}
private void setDeviceUUID(){
this.deviceUUID = UUID.randomUUID().toString();
private void setLocalDeviceUUID(){
this.localDeviceUUID = UUID.randomUUID().toString();
}
private String[] messageStringSplitter(String message) {
return message.split(delimiter);
}
public void getNewReceivedMessage(String newMessage) {
String[] messageString = messageStringSplitter(newMessage);
String timeStamp = messageString[0];
String deviceID = messageString[1];
boolean sensorStatus = convertSensorStatus(messageString[2]);
String sensorType = messageString[3];
int sensorMassage = Integer.valueOf(messageString[4]);
if (deviceID.equals(checkDeviceID(localDeviceUUID))) {
return;
}
if(!connectedDevicesList.containsKey(deviceID)) {
createNewDevice(timeStamp, deviceID, sensorStatus, sensorType, sensorMassage);
}
else {
updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
}
}
private boolean convertSensorStatus(String status) {
return status.equals(SensorStatusKey);
}
}

View File

@ -93,8 +93,8 @@ public class AccelerometerViewModel extends ViewModel {
return mDeviceList;
}
public void setDevice(String deviceID, String timeStamp, String newDeviceID, boolean sensorStatus, String sensorType, int sensorMassage) {
mDeviceRepository.setDevice(deviceID, timeStamp,newDeviceID, sensorStatus, sensorType, sensorMassage);
public void setDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
}
public void setTimeStamp(String deviceID, String timeStamp) {

View File

@ -4,6 +4,7 @@ import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
import com.example.greenwatch.communication.WiFiCommunication;
import com.example.greenwatch.models.Device;
import com.example.greenwatch.repositories.DeviceRepository;
@ -14,12 +15,18 @@ public class MainActivityViewModel extends ViewModel {
private MutableLiveData<List<Device>> mDeviceList;
private DeviceRepository mDeviceRepository;
public void init() {
WiFiCommunication mWiFiCommunication;
if(mDeviceList != null) {
return;
}
//todo: check if WiFi instanz can be hold only by the repository
mDeviceRepository = DeviceRepository.getInstance();
mDeviceRepository.createNewDevice("", mDeviceRepository.getLocalDeviceUUID(), false, "", 0);
mWiFiCommunication = WiFiCommunication.getInstance();
mDeviceRepository.setWiFiCommunication(mWiFiCommunication);
mWiFiCommunication.setDeviceRepository(mDeviceRepository);
mDeviceRepository.createNewDevice("", mDeviceRepository.getLocalDeviceUUID(), false, "No Sensor selected", 0);
mDeviceList = mDeviceRepository.getConnectedDeviceList();
}
@ -27,8 +34,8 @@ public class MainActivityViewModel extends ViewModel {
return mDeviceList;
}
public void setDevice(String deviceID, String timeStamp, String newDeviceID, boolean sensorStatus, String sensorType, int sensorMassage) {
mDeviceRepository.setDevice(deviceID, timeStamp,newDeviceID, sensorStatus, sensorType, sensorMassage);
public void setDevice(String deviceID, String timeStamp, boolean sensorStatus, String sensorType, int sensorMassage) {
mDeviceRepository.updateDevice(deviceID, timeStamp, sensorStatus, sensorType, sensorMassage);
}
public void setTimeStamp(String deviceID, String timeStamp) {

View File

@ -1,25 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
tools:context=".ConnectionActivity">
<TextView
android:id="@+id/tvConnectionStatusmessage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Connection Activity">
</TextView>
<Button
android:id="@+id/connectionBackToMainActivity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Back to MainActivity">
</Button>
</LinearLayout>

View File

@ -13,14 +13,22 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!"
android:layout_weight="1">
android:layout_weight="4">
</TextView>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/deviceListRecyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="2"
tools:listitem="@layout/device_item">
</androidx.recyclerview.widget.RecyclerView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_weight="1">
android:layout_weight="3">
<Button
android:id="@+id/audiodetectionButton"

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/tvDeviceSensorStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:text="@string/sensor_status_placeholder"
android:textAppearance="@style/TextAppearance.AppCompat.Large">
</TextView>
<TextView
android:id="@+id/tvDeviceSensorType"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/sensor_type_placeholder"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
android:maxLines="1"
android:layout_toStartOf="@id/tvDeviceSensorStatus"
android:layout_alignParentStart="true"
android:ellipsize="end">
</TextView>
<TextView
android:id="@+id/tvDeviceID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tvDeviceSensorType"
android:text="@string/deviceID_placeholder">
</TextView>
<TextView
android:id="@+id/tvDeviceTimeStamp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tvDeviceID"
android:text="@string/sensor_time_stamp_placeholder">
</TextView>
<TextView
android:id="@+id/tvDeviceSensorMassage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tvDeviceTimeStamp"
android:text="@string/sensor_message_placeholder">
</TextView>
</RelativeLayout>
</androidx.cardview.widget.CardView>

View File

@ -1,3 +1,8 @@
<resources>
<string name="app_name">GreenWatch</string>
<string name="sensor_type_placeholder">Sensortyp: %s</string>
<string name="sensor_status_placeholder">Sensorstatus: %s</string>
<string name="deviceID_placeholder">Sensor-ID: %s</string>
<string name="sensor_time_stamp_placeholder">Timestamp: %s</string>
<string name="sensor_message_placeholder">Sensormessage: %d</string>
</resources>