Vorkonfiguration der Module innerhalb der Edge Application

Hallo Zusammen,

gibt es die Möglichkeit eine Modulkonfiguration schon beim Packen der Jar vorzugeben, sodass beim Ausführen der Jar schon diverse Geräte, Controller etc. konfiguriert und aktiviert sind?

Hallo Andreas,

ich sehe drei Möglichkeiten:

  1. Über “Inline Component Properties”, d.h. über die Component-Annotation
  2. Über “Component Properties from resource files”, d.h. über Java properties Dateien im Bundle

Zu 1 und 2: siehe http://blog.vogella.com/2016/09/26/configuring-osgi-declarative-services/

  1. Du kannst die Konfigurationsdateien für den Componentmanager über ein Shell-Script vordefinieren. Das ist zwar dann nicht in der Jar-Datei, aber man bleibt flexibler und kann die Konfiguration auch ändern. Hier ein kurzer Ausschnitt, wie wir das machen:
#!/bin/bash
#
# Script to automatically setup a FEMS.

set -e

# Define environment variables
BASE_PATH="/etc/openems.d"
CONF_SCHEDULER="Scheduler/AllAlphabetically/d0ec9992-e625-4ee4-b252-c9d9d417d78c.config"
CONF_CORE_PROHYBRID10="Kaco/BlueplanetHybrid10/Core/b11f6d44-631d-49a7-a9eb-fd063aa1ed3e.config"
CONF_ESS0_PROHYBRID10="Kaco/BlueplanetHybrid10/Ess/0bb53c70-83ff-40ba-b351-1c4df781ab4f.config"
CONF_METER0_PROHYBRID10="Kaco/BlueplanetHybrid10/GridMeter/008bcc03-a824-4cad-9fcd-993bbbb6f4ad.config"
CONF_CHARGER0_PROHYBRID10="Kaco/BlueplanetHybrid10/Charger/30b51193-e256-42b9-a743-b1c043c713fa.config"
CONF_CTRL_DEBUG_LOG="Controller/Debug/Log/28233476-3bb6-4773-b8f5-c2a7a47b85a2.config"
CONF_CTRL_API_REST="Controller/Api/Rest/bbcd5803-e577-4d88-b8eb-53c5d772687c.config"
CONF_CTRL_API_WEBSOCKET="Controller/Api/Websocket/9dc51b52-feb6-4f5d-a3b3-5ee6997b20c9.config"

#
# Setup configuration that is valid for every system
#
function setup_generic {
	if [ -d $BASE_PATH ]; then
		read -p "Press enter to delete $BASE_PATH"
		echo "# Deleting $BASE_PATH"
		find $BASE_PATH ! -wholename "$BASE_PATH" ! -name 'config.json' -exec rm -rf {} +
	fi
	echo "# Creating $BASE_PATH"
	mkdir -p $BASE_PATH
	cd $BASE_PATH

	setup_ctrl_debug_log
	setup_ctrl_api_rest
	setup_ctrl_api_websocket
}

#
# Setup scheduler configuration for read-only systems (Mini, Pro Hybrid)
#
function setup_scheduler_readonly {
	echo "# Creating $CONF_SCHEDULER"
	mkdir -p "$(dirname $CONF_SCHEDULER)"
	cat >$CONF_SCHEDULER <<EOL
controllers.ids=[]
cycleTime=I"1000"
enabled=B"true"
id="scheduler0"
service.factoryPid="Scheduler.AllAlphabetically"
service.pid="Scheduler.AllAlphabetically.d0ec9992-e625-4ee4-b252-c9d9d417d78c"
EOL
}

#
# Setup Controller Debug.Log
#
function setup_ctrl_debug_log {
	echo "# Creating $CONF_CTRL_DEBUG_LOG"
	mkdir -p "$(dirname $CONF_CTRL_DEBUG_LOG)"
	cat >$CONF_CTRL_DEBUG_LOG <<EOL
enabled=B"true"
id="ctrlDebugLog0"
service.factoryPid="Controller.Debug.Log"
service.pid="Controller.Debug.Log.28233476-3bb6-4773-b8f5-c2a7a47b85a2"
EOL
}

#
# Setup Controller Api.Rest
#
function setup_ctrl_api_rest {
	echo "# Creating $CONF_CTRL_API_REST"
	mkdir -p "$(dirname $CONF_CTRL_API_REST)"
	cat >$CONF_CTRL_API_REST <<EOL
apiTimeout="60"
enabled="true"
id="ctrlApiRest0"
port="8084"
service.factoryPid="Controller.Api.Rest"
service.pid="Controller.Api.Rest.bbcd5803-e577-4d88-b8eb-53c5d772687c"
EOL
}

#
# Setup Controller Api.Websocket
#
function setup_ctrl_api_websocket {
	echo "# Creating $CONF_CTRL_API_WEBSOCKET"
	mkdir -p "$(dirname $CONF_CTRL_API_WEBSOCKET)"
	cat >$CONF_CTRL_API_WEBSOCKET <<EOL
apiTimeout=I"60"
enabled=B"true"
id="ctrlApiWebsocket0"
port=I"8085"
service.factoryPid="Controller.Api.Websocket"
service.pid="Controller.Api.Websocket.9dc51b52-feb6-4f5d-a3b3-5ee6997b20c9"
EOL
}

#
# Setup FENECON Pro Hybrid 10-Serie Components
#
function setup_pro_hybrid_10_components {
	echo "# Creating $CONF_CORE_PROHYBRID10"
	mkdir -p "$(dirname $CONF_CORE_PROHYBRID10)"
	cat >$CONF_CORE_PROHYBRID10 <<EOL
enabled=B"true"
id="kacoCore0"
service.factoryPid="Kaco.BlueplanetHybrid10.Core"
service.pid="Kaco.BlueplanetHybrid10.Core.b11f6d44-631d-49a7-a9eb-fd063aa1ed3e"
userkey="user"
EOL
	echo "# Creating $CONF_ESS0_PROHYBRID10"
	mkdir -p "$(dirname $CONF_ESS0_PROHYBRID10)"
	cat >$CONF_ESS0_PROHYBRID10 <<EOL
core.id="kacoCore0"
core.target="(&(enabled\=true)(!(service.pid\=Kaco.BlueplanetHybrid10.Ess.0bb53c70-83ff-40ba-b351-1c4df781ab4f))(|(id\=kacoCore0)))"
enabled=B"true"
id="ess0"
maxP=I"4000"
readOnly=B"true"
service.factoryPid="Kaco.BlueplanetHybrid10.Ess"
service.pid="Kaco.BlueplanetHybrid10.Ess.0bb53c70-83ff-40ba-b351-1c4df781ab4f"
EOL
	echo "# Creating $CONF_METER0_PROHYBRID10"
	mkdir -p "$(dirname $CONF_METER0_PROHYBRID10)"
	cat >$CONF_METER0_PROHYBRID10 <<EOL
core.id="kacoCore0"
core.target="(&(enabled\=true)(!(service.pid\=Kaco.BlueplanetHybrid10.GridMeter.008bcc03-a824-4cad-9fcd-993bbbb6f4ad))(|(id\=kacoCore0)))"
enabled=B"true"
id="meter0"
service.factoryPid="Kaco.BlueplanetHybrid10.GridMeter"
service.pid="Kaco.BlueplanetHybrid10.GridMeter.008bcc03-a824-4cad-9fcd-993bbbb6f4ad"
EOL
	echo "# Creating $CONF_CHARGER0_PROHYBRID10"
	mkdir -p "$(dirname $CONF_CHARGER0_PROHYBRID10)"
	cat >$CONF_CHARGER0_PROHYBRID10 <<EOL
core.id="kacoCore0"
core.target="(&(enabled\=true)(!(service.pid\=Kaco.BlueplanetHybrid10.Charger.30b51193-e256-42b9-a743-b1c043c713fa))(|(id\=kacoCore0)))"
enabled=B"true"
id="charger0"
service.factoryPid="Kaco.BlueplanetHybrid10.Charger"
service.pid="Kaco.BlueplanetHybrid10.Charger.30b51193-e256-42b9-a743-b1c043c713fa"
EOL
}

function setup_pro_hybrid_10 {
	setup_generic
	setup_scheduler_readonly
	setup_pro_hybrid_10_components
}

function choose_setup {
	CHOICE=$(whiptail --menu "Select:" 20 45 12 \
		"FENECON Pro Hybrid 10-Serie" "" \
		3>&1 1>&2 2>&3)

	case $CHOICE in
		"FENECON Pro Hybrid 10-Serie")  setup_pro_hybrid_10;;
	esac
}

choose_setup

Gruß,
Stefan

1 Like

Hallo Stefan,

danke für deinen Input!

Ich habs nun etwas anders gemacht und zwar mit Hilfe des Configuration Admin.
Da gibts in diesem Blog ebenfalls ein gutes Beispiel:
http://blog.vogella.com/2017/02/24/control-osgi-ds-component-instances-via-configuration-admin/

Man kann recht einfach prüfen, ob es schon eine Configuration gibt, diese entsprechend updaten oder eine neue erstellen.

Liebe Grüße
Andy

Hallo Andy,

ok, super. Das heißt du erstellst die Konfiguration jetzt direkt per Code? Anstatt das alles selbst zu machen, wäre es evtl. sinnvoll, die JSON-RPC Api des ComponentManager zu nutzen: https://github.com/OpenEMS/openems/blob/develop/io.openems.edge.core/src/io/openems/edge/core/componentmanager/ComponentManagerImpl.java#L174

Gruß,
Stefan