Skip to content
Snippets Groups Projects
Commit 9ac366df authored by René Schöne's avatar René Schöne
Browse files

Merge branch 'dev' into learner

parents 1d6ab067 4221d160
Branches
No related tags found
No related merge requests found
Showing
with 120 additions and 103 deletions
......@@ -22,10 +22,7 @@ There are a few subprojects in this repository:
## Setup and Building
This project uses Gradle as the build tool. Please use the provided Gradle wrappers instead of an installed one.
- Clone the repository, either using [https](https://git-st.inf.tu-dresden.de/OpenLicht/eraser.git) or [ssh](git@git-st.inf.tu-dresden.de:OpenLicht/eraser.git)
- (Optional) Build all subprojects: `./gradlew build`
This project uses Gradle as the build tool. For detailed information, see [setup guidelines](/../wikis/setup)
## Running the demo
......
......@@ -4,7 +4,7 @@ plugins {
allprojects {
group = 'de.tudresden.inf.st'
version = '1.0.0-SNAPSHOT'
version = '0.1'
}
subprojects {
......@@ -32,6 +32,10 @@ subprojects {
testArtifacts testJar
}
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.2'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.2'
......
repositories {
mavenCentral()
}
apply plugin: 'java'
sourceCompatibility = 1.8
dependencies {
compile group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1'
}
......
repositories {
mavenCentral()
}
apply plugin: 'jastadd'
apply plugin: 'application'
apply plugin: 'jacoco'
......@@ -84,11 +80,7 @@ jastadd {
parser.genDir = "src/gen/java/de/tudresden/inf/st/eraser/jastadd/parser"
}
idea {
module {
generatedSourceDirs += file('src/gen/java')
}
}
idea.module.generatedSourceDirs += file('src/gen/java')
sourceSets.main {
java {
......
......@@ -15,6 +15,7 @@ aspect ItemHandling {
eq ColorItem.getStateAsString() = getState().toString();
eq DateTimeItem.getStateAsString() = getState().toString();
eq ItemWithBooleanState.getStateAsString() = Boolean.toString(getState());
eq SwitchItem.getStateAsString() = getState() ? "ON" : "OFF";
eq ItemWithDoubleState.getStateAsString() = Double.toString(getState());
eq ItemWithStringState.getStateAsString() = getState();
......@@ -67,6 +68,13 @@ aspect ItemHandling {
public void ItemWithBooleanState.setStateFromString(String value) {
this.setState(Boolean.parseBoolean(value));
}
public void SwitchItem.setStateFromString(String value) {
switch (value) {
case "ON": this.setState(true); break;
case "OFF": this.setState(false); break;
default: super.setStateFromString(value);
}
}
public void ItemWithDoubleState.setStateFromString(String value) {
this.setState(Double.parseDouble(value));
}
......
......@@ -24,6 +24,7 @@ import java.util.Objects;
*/
public class ParserUtils {
public static final String UNKNOWN_GROUP_NAME = "Unknown";
private static boolean verboseLoading = false;
private static final Logger logger = LogManager.getLogger(ParserUtils.class);
......@@ -172,7 +173,7 @@ public class ParserUtils {
*/
public static void createUnknownGroup(OpenHAB2Model model, Collection<Item> danglingItems) {
Group unknownGroup = new Group();
unknownGroup.setID("Unknown");
unknownGroup.setID(UNKNOWN_GROUP_NAME);
model.addGroup(unknownGroup);
danglingItems.forEach(unknownGroup::addItem);
logger.info("Created new {}", unknownGroup.prettyPrint().trim());
......@@ -234,4 +235,21 @@ public class ParserUtils {
return result;
}
public static Item parseItem(String definition)
throws IllegalArgumentException, IOException, Parser.Exception {
StringReader reader = new StringReader(definition);
EraserScanner scanner = new EraserScanner(reader);
EraserParser parser = new EraserParser();
Root root = (Root) parser.parse(scanner);
reader.close();
int size = root.getOpenHAB2Model().items().size();
if (size == 0) {
throw new IllegalArgumentException("Model does not contain any items!");
}
if (size > 1) {
logger.warn("Model does contain {} items, ignoring all but the first.", size);
}
return root.getOpenHAB2Model().items().get(0);
}
}
Color Item: id="Go1_item" label="Go 1" state="0,0,0" category="Lighting" ;
Switch Item: id="Rule_Switch" state="false" ;
Switch Item: id="Rule_Switch" state="OFF" ;
Number Item: id="Color_Manual_Slider" state="0.0" ;
Number Item: id="watch_acceleration_x" label="Watch Acceleration X" state="0.0" ;
Number Item: id="watch_acceleration_y" label="Watch Acceleration Y" state="0.0" ;
......
......@@ -12,7 +12,7 @@ Color Item: id="iris1_item" label="Iris 1" state="253,0,0" category="Lighting" m
Number Item: id="moto_360_brightness" label="Moto 360 Brightness" state="0.0" category="Brightness" ;
Number Item: id="polar_brightness" label="Polar Brightness" state="0.0" category="Brightness" ;
String Item: id="samsung_brightness" label="Samsung Brightness" state="" category="Brightness" ;
Switch Item: id="Rule_Switch" state="false" ;
Switch Item: id="Rule_Switch" state="OFF" ;
Number Item: id="Color_Manual_Slider" state="0.0" ;
Number Item: id="watch_acceleration_x" label="Watch Acceleration X" state="6.264883611883931E-10" ;
Number Item: id="watch_acceleration_y" label="Watch Acceleration Y" state="1.5765462769316607E-19" ;
......
......@@ -17,5 +17,6 @@ Player Item : id="player1" label="a Player Item" state="jkl" topic="item/str/pla
RollerShutter Item : id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state";
String Item : id="string1" label="a String Item" state="mno" topic="item/str/string1/state";
Switch Item : id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state";
Switch Item : id="switch2" label="a second Switch Item" state="OFF" topic="item/bool/switch2/state";
Item : id="default1" label="a Default Item" state="pqr" topic="item/str/default1/state";
Influx: host="localhost" ;
......@@ -9,11 +9,12 @@ Player Item: id="player1" label="a Player Item" state="jkl" topic="item/str/play
Number Item: id="number1" label="a Number Item" state="456.0" topic="item/double/number1/state" ;
RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state" ;
String Item: id="string1" label="a String Item" state="mno" topic="item/str/string1/state" ;
Switch Item: id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state" ;
Switch Item: id="switch1" label="a Switch Item" state="ON" topic="item/bool/switch1/state" ;
Switch Item: id="switch2" label="a second Switch Item" state="OFF" topic="item/bool/switch2/state" ;
Group: id="my-first-group" items=["color1", "contact1", "image1", "location1"] aggregation="AND" ("ON", "OFF") ;
Group: id="my-second-group" items=["datetime1", "default1"] ;
Group: id="my-third-group" items=["dimmer1", "player1"] ;
Group: id="my-empty-group" ;
Group: id="Unknown" items=["number1", "rollerShutter1", "string1", "switch1"] ;
Group: id="Unknown" items=["number1", "rollerShutter1", "string1", "switch1", "switch2"] ;
Mqtt: incoming="ppc3/" outgoing="oh2/in/" host="localhost" ;
Influx: host="localhost" ;
......@@ -10,7 +10,7 @@ Number Item: id="number1" label="a Number Item" state="456.0" topic="item/double
RollerShutter Item: id="rollerShutter1" label="a RollerShutter Item" state="false" topic="item/str/rs1/state" ;
Activity Item: id="activity" ;
String Item: id="string1" label="a String Item" state="mno" topic="item/str/string1/state" ;
Switch Item: id="switch1" label="a Switch Item" state="true" topic="item/bool/switch1/state" controls=["rollerShutter1"] ;
Switch Item: id="switch1" label="a Switch Item" state="ON" topic="item/bool/switch1/state" controls=["rollerShutter1"] ;
Group: id="my-first-group" items=["color1", "contact1", "image1", "location1"] aggregation="AND" ("ON", "OFF") ;
Group: id="my-second-group" items=["datetime1", "default1"] ;
Group: id="my-third-group" items=["dimmer1", "player1"] ;
......
Thing: id="min-thing" type="min-thing-type" ;
Thing: id="max-thing" label="Max Thing" type="max-thing-type" channels=["min-channel", "max-channel"] ;
Number Item: id="min-item" state="0.0" ;
Switch Item: id="max-item" label="Item with all members set" state="true" category="not used" topic="items/max" controls=["min-item"] metaData={"one":"true", "zero":"false"} ;
Switch Item: id="max-item" label="Item with all members set" state="ON" category="not used" topic="items/max" controls=["min-item"] metaData={"one":"true", "zero":"false"} ;
Group: id="min-group" ;
Group: id="max-group" groups=["min-group"] items=["min-item", "max-item"] aggregation="AND" ("one", "two") ;
ThingType: id="min-thing-type" ;
......
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.2.RELEASE")
}
}
plugins {
id 'java'
id 'io.franzbecker.gradle-lombok' version '1.14'
}
repositories {
mavenCentral()
}
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
sourceCompatibility = 1.8
dependencies {
compile project(':eraser-base')
compile 'org.springframework.boot:spring-boot-starter-web'
......
plugins {
id 'java'
id 'application'
id 'io.franzbecker.gradle-lombok' version '3.0.0'
}
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
dependencies {
compile project(':eraser-base')
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.11.2'
......
......@@ -3,12 +3,15 @@ package de.tudresden.inf.st.eraser.spark;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.tudresden.inf.st.eraser.jastadd.model.*;
import de.tudresden.inf.st.eraser.util.JavaUtils;
import de.tudresden.inf.st.eraser.util.ParserUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.eclipse.jetty.http.HttpStatus;
import spark.Request;
import spark.Response;
import spark.Spark;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -41,14 +44,20 @@ public class Application {
Spark.path("/", () -> Spark.before((request, response) -> logger.debug(request.pathInfo())));
Spark.path("/activity", () -> {
//--- GET /activity ---
Spark.get("",
(request, response) -> wrapActivityList(root.getMachineLearningRoot().getActivityList()),
mapper::writeValueAsString);
//--- GET /activity/current ---
Spark.get("/current",
(request, response) -> JavaUtils.ifPresentOrElseReturn(root.currentActivity(),
this::wrapActivity,
() -> makeError(response, 204, "No activity recognized.")),
mapper::writeValueAsString);
//--- PUT /activity/current ---
Spark.put("/current", (request, response) -> {
logger.info("request body: '{}', params: '{}', length={}", request.body(), request.params(), request.contentLength());
if (!root.getMachineLearningRoot().hasActivityRecognition()) {
......@@ -62,6 +71,8 @@ public class Application {
return makeError(response, 501, "Activity not editable for " + activityRecognition.getClass().getSimpleName());
}
});
//--- GET /activity/:identifier ---
Spark.get("/:identifier",
(request, response) ->
JavaUtils.ifPresentOrElseReturn(root.resolveActivity(paramAsInt(request, "identifier")),
......@@ -71,9 +82,13 @@ public class Application {
});
Spark.path("/events", () -> {
//--- GET /events ---
Spark.get("",
(request, response) -> wrapChangeEventList(root.getMachineLearningRoot().getChangeEventList()),
mapper::writeValueAsString);
//--- GET /events/:identifier ---
Spark.get("/:identifier",
(request, response) ->
JavaUtils.ifPresentOrElseReturn(root.resolveChangeEvent(paramAsInt(request, "identifier")),
......@@ -83,14 +98,39 @@ public class Application {
});
Spark.path("/model", () -> {
//--- GET /model/full ---
Spark.get("/full", (request, response) -> {
response.type("text/plain");
return root.prettyPrint();
});
Spark.get("/items",
Spark.path("/items", () -> {
//--- GET /model/items ---
Spark.get("",
(request, response) -> wrapItemList(root.getOpenHAB2Model().items()),
mapper::writeValueAsString);
Spark.put("/items/:identifier/state", (request, response) -> {
Spark.path("/:identifier", () -> {
Spark.put("", (request, response) -> {
OpenHAB2Model openHAB2Model = root.getOpenHAB2Model();
Item item = ParserUtils.parseItem(request.body());
if (!openHAB2Model.resolveItem(item.getID()).isPresent()) {
JavaUtils.ifPresentOrElse(
root.getOpenHAB2Model().resolveGroup(ParserUtils.UNKNOWN_GROUP_NAME),
group -> group.addItem(item),
() -> ParserUtils.createUnknownGroup(root.getOpenHAB2Model(), Collections.singletonList(item)));
response.status(201);
}
return "OK";
});
//--- GET /model/items/:identifier/state ---
Spark.get("/state", (request, response) ->
safeItemRoute(request, response, Item::getStateAsString));
//--- PUT /model/items/:identifier/state ---
Spark.put("/state", (request, response) -> {
logger.info("request body: '{}', params: '{}', length={}", request.body(), request.params(), request.contentLength());
return safeItemRoute(request, response,
item -> {
......@@ -103,13 +143,18 @@ public class Application {
}
});
});
Spark.get("/items/:identifier/history",
});
//--- GET /model/items/:identifier/history ---
Spark.get("/:identifier/history",
(request, response) -> {
logger.info("request body: '{}', params: '{}', length={}", request.body(), request.params(), request.contentLength());
return safeItemRoute(request, response, item -> makeHistory(item, response));
});
});
});
//--- POST /system/exit ---
Spark.post("/system/exit", (request, response) -> {
try {
lock.lock();
......
......@@ -51,12 +51,18 @@ sourceSets {
}
}
distributions {
main {
contents {
from {
'src/main/resources/starter.eraser'
}
}
//distributions {
// main {
// contents {
// from {
// 'src/main/resources/starter.eraser'
// }
// }
// }
//}
applicationDistribution.from("src/main/resources") {
include "starter.eraser"
}
applicationDistribution.from(".") {
include "starter-setting.yaml"
}
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
apply plugin: 'java'
dependencies {
compile project(':eraser-base')
compile project(':feedbackloop.api')
......
plugins {
id 'java'
id 'io.franzbecker.gradle-lombok' version '3.0.0'
}
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
dependencies {
compile project(':eraser-base')
compile project(':commons.color')
......
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
apply plugin: 'java'
dependencies {
compile project(':eraser-base')
compile project(':feedbackloop.api')
......
repositories {
mavenCentral()
}
sourceCompatibility = 1.8
apply plugin: 'java'
apply plugin: 'application'
dependencies {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment