Skip to content

Commit

Permalink
Simplify module structure, separate pure json data from html renderab…
Browse files Browse the repository at this point in the history
…les and move models into base module
  • Loading branch information
sknull committed Mar 30, 2024
1 parent 758d458 commit b07f96c
Show file tree
Hide file tree
Showing 220 changed files with 3,168 additions and 22,068 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/github-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ jobs:
- name: Build and deploy package
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: mvn --batch-mode clean package deploy -DskipTests
run: mvn --batch-mode clean package deploy -DskipTests -Pgithub
43 changes: 43 additions & 0 deletions klanglicht-module-base/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>

<parent>
<groupId>de.visualdigits</groupId>
<artifactId>klanglicht-kt</artifactId>
<version>${revision}</version>
</parent>

<artifactId>klanglicht-module-base</artifactId>
<version>${revision}</version>

<properties>
<version.twinkly>0.0.1-SNAPSHOT</version.twinkly>
</properties>

<dependencies>

<dependency>
<groupId>de.visualdigits</groupId>
<artifactId>twinkly-api</artifactId>
<version>${version.twinkly}</version>
</dependency>

<!-- serial port -->
<dependency>
<groupId>io.github.java-native</groupId>
<artifactId>jssc</artifactId>
<version>2.9.4</version>
</dependency>

<!-- html -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -1,45 +1,60 @@
package de.visualdigits.kotlin.klanglicht.rest.lightmanager.feign

import de.visualdigits.kotlin.klanglicht.model.lightmanager.json.LmAirProject
import de.visualdigits.kotlin.klanglicht.model.lightmanager.json.NType
import de.visualdigits.kotlin.klanglicht.rest.configuration.ConfigHolder
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMAction
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMActor
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMMarker
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMMarkers
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMParams
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMScene
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMScenes
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMZones
import jakarta.annotation.PostConstruct
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.client

import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json.LmAirProject
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json.NType
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMActionIR
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMActionPause
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMActionUrl
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMActor
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMMarker
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMMarkers
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMParams
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMScene
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMScenes
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMZones
import de.visualdigits.kotlin.util.get
import de.visualdigits.kotlin.util.post
import org.jsoup.Jsoup
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Component
import java.net.HttpURLConnection
import java.net.URL
import java.util.zip.GZIPInputStream

@Component
class LightmanagerClient(
var lightmanagerUrl: String? = null,
var client: LightmanagerFeignClient? = null
val lightmanagerUrl: String
) {

@Autowired
val configHolder: ConfigHolder? = null
companion object {
const val COLOR_ON = "#FF7676"
const val COLOR_OFF = "#91FFAA"
}

fun html(): String? {
return URL("$lightmanagerUrl/").get<String>()
}

@PostConstruct
fun initialize() {
if (lightmanagerUrl?.isEmpty() == true) {
lightmanagerUrl = configHolder!!.preferences?.getService("lmair")?.url
}
client = LightmanagerFeignClient.client(lightmanagerUrl)
fun configXml(): String? {
return URL("$lightmanagerUrl/config.xml").get<String>()
}

fun paramsJson(): String? {
return URL("$lightmanagerUrl/params.json").get<String>()
}

fun controlScene(sceneId: Int): String? {
return URL("$lightmanagerUrl/control?key=$sceneId").post<String>()
}

fun controlIndex(index: Int): String? {
return URL("$lightmanagerUrl/control?scene=$index").post<String>()
}

fun params(): LMParams {
return LMParams.load(client!!.paramsJson()!!)
return LMParams.load(paramsJson()!!)
}

fun zones(): LMZones {
val markers: LMMarkers = markers()
val document = Jsoup.parse(client!!.html()!!)
val document = Jsoup.parse(html()!!)
val setUpName = document.select("div[id=mytitle]").first()?.text()?:""
val zones = LMZones(setUpName)
document
Expand Down Expand Up @@ -73,8 +88,9 @@ class LightmanagerClient(
return actors
}

@Suppress("unchecked_cast")
fun scenes(lmAirProject: LmAirProject? = null): LMScenes {
val document = Jsoup.parse(client!!.html()!!)
val document = Jsoup.parse(html()!!)
val setupName = document.select("div[id=mytitle]").first()?.text()
val scenes = LMScenes(setupName)
document
Expand All @@ -84,11 +100,19 @@ class LightmanagerClient(
?.forEach { elem ->
scenes.add(
LMScene(
elem.attr("id").substring(1).toInt(),
elem.child(0).text()
id = elem.attr("id").substring(1).toInt(),
name = elem.child(0).text()
)
)
}
determineActions(lmAirProject, scenes)
return scenes
}

private fun determineActions(
lmAirProject: LmAirProject?,
scenes: LMScenes
) {
if (lmAirProject != null) {
scenes.scenes.forEach {
it.value.forEach { scene ->
Expand All @@ -102,25 +126,41 @@ class LightmanagerClient(
actuator.properties?.url2
} else {
actuator.properties?.url
}?:""
LMAction(url)
}
if (url != null) {
LMActionUrl(
comment = actuator.properties?.comment,
url = url.substringAfter("v1/")
)
} else {
val param = if (ap.command == 1) {
actuator.properties?.paramOff
} else {
actuator.properties?.paramOn
}
if (param != null) {
LMActionIR(comment = actuator.properties?.comment, param = param)
} else {
null
}
}
}
}
NType.pause ->
LMAction(duration = ap.duration?:0)
else -> null

NType.pause -> LMActionPause(duration = ap.duration?.let { d -> 1000 * d } ?: 0)
else ->
null
}
}
}
}
}
}
return scenes
}

fun markers(): LMMarkers {
val markerState: BooleanArray = params().markerState
val document = Jsoup.parse(client!!.html()!!)
val document = Jsoup.parse(html()!!)
val setupName = document.select("div[id=mytitle]").first()?.text()
val markers = LMMarkers()
markers.name = setupName
Expand All @@ -147,17 +187,4 @@ class LightmanagerClient(
}
return markers
}

fun controlScene(sceneId: Int) {
client!!.controlScene(sceneId)
}

fun controlIndex(index: Int) {
client!!.controlIndex(index)
}

companion object {
const val COLOR_ON = "#FF7676"
const val COLOR_OFF = "#91FFAA"
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json

import com.fasterxml.jackson.annotation.JsonIgnore

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json

import com.fasterxml.jackson.annotation.JsonProperty


class ActuatorProperties(
var ntype: NType? = null,
var index: Int? = null,
var system: Int? = null,
@JsonProperty("bemerkung") val comment: String? = null,
var ip: String? = null, // since 10.6.4
var mac: String? = null, // since 10.6.4
@JsonProperty("typ") var typ: String? = null, // since 10.6.4
@JsonProperty("paramon") var paramOn: String? = null,
@JsonProperty("paramoff") var paramOff: String? = null,
var sequences: Int? = null,
@JsonProperty("btnnameon") var buttonNameOn: String? = null,
@JsonProperty("btnnameoff") var buttonNameOff: String? = null,
@JsonProperty("deviceid") var deviceId: String? = null,
var marker: String? = null,
var url: String? = null,
var url2: String? = null,
var sunset: Boolean? = null,
@JsonProperty("httptype") var httpType: Int? = null,
@JsonProperty("httptype2") var httpType2: Int? = null,
@JsonProperty("ntypenew") var ntypeNew: Int? = null // since 10.7.2
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json


class Device(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json

import com.fasterxml.jackson.annotation.JsonIgnore
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json


class Marker(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json

import com.fasterxml.jackson.annotation.JsonValue

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json


enum class RequestType(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json


class Scene(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json

import com.fasterxml.jackson.annotation.JsonProperty

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.model.lightmanager.json
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json


class Settings(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.deserializer
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json.deserializer

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.deserializer
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json.deserializer

import com.fasterxml.jackson.databind.util.StdConverter
import de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.LMParams
import de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm.LMParams
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package de.visualdigits.kotlin.klanglicht.rest.lightmanager.model.html.deserializer
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.json.deserializer

import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.DeserializationContext
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm

import com.fasterxml.jackson.annotation.JsonSubTypes
import com.fasterxml.jackson.annotation.JsonSubTypes.Type
import com.fasterxml.jackson.annotation.JsonTypeInfo

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.WRAPPER_OBJECT
)
@JsonSubTypes(
Type(name = "pause", value = LMActionPause::class),
Type(name = "url", value = LMActionUrl::class),
Type(name = "ir", value = LMActionIR::class),
)
abstract class LMAction(
val comment: String? = null
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm

class LMActionIR(
comment: String? = null,
val param: String
) : LMAction(comment) {

override fun toString(): String {
return "[IR] $comment: $param"
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package de.visualdigits.kotlin.klanglicht.hardware.lightmanager.model.lm

class LMActionPause(
val duration: Long? = null
) : LMAction() {

override fun toString(): String {
return "[Pause] $duration"
}
}

Loading

0 comments on commit b07f96c

Please sign in to comment.