Zurück zum Inhaltsverzeichnis
Zurück zu Kapitel 7


8. BSB-LAN: Einbindung mittels zusätzlicher Software

Achtung:
Die in den nachfolgenden Unterkapiteln dargestellten Codebeispiele und/oder Module sind u.U. noch nicht an die Änderungen angepasst, die mit der Umstellung der BSB-LAN-Version auf die v3.x einher gingen. Es kann also sein, dass einige Beispiele nicht mehr 1:1 übernommen werden können, sondern angepasst werden müssen. Als Beispiel sei hier der Wegfall des URL-Befehls /T erwähnt, der in vorherigen Versionen die Werte der angeschlossenen Sensoren ausgab und in den nachfolgenden Beispielen hin und wieder noch vorzufinden ist.
Solltest du ein Codebeispiel oder ein Modul entdecken, das in der dargestellten Form nicht mit der aktuellen BSB-LAN-Version v3.x lauffähig ist, so informiere bitte den entspr. Autor des Beispiels/Moduls und schicke mir ggf. ein entsprechend angepasstes Beispiel, damit ich die korrigierte Version hier einstellen kann.
Danke.

Da der Adapter lediglich eine Schnittstelle darstellt, mittels derer man Zugriff auf den Heizungsregler via Computer erhält, können selbstverständlich externe Programme zum Einsatz kommen. Somit kann die Heizungssteuerung in komplexe Heimautomationssysteme eingebunden werden. Auch das Erstellen von umfassenden Logdateien und deren grafische Aufbereitung kann auf diese Weise erfolgen.

Da es hierfür verschiedene Softwarelösungen gibt, kann hier weder eine umfangreiche Vorstellung der verschiedenen Systeme erfolgen, noch eine grundsätzliche Anleitung zur Integration des Adapters oder einer Heizungsregelung per se gegeben werden. Sollte jedoch bereits eines der nachfolgend erwähnten Systeme zum Einsatz kommen, so sind die folgenden Beispielkonfigurationen hoffentlich eine kleine Starthilfe, um die eigenen Vorstellungen umzusetzen.

Sollten Fragen bzgl. der folgenden Beispiele oder anderer Konfigurationsmöglichkeiten auftreten, so ist bitte von diesbezüglichen Anfragen an mich abzusehen - die Fragen sollten mittels entsprechender Literatur oder in spezifischen Foren geklärt werden.

Hinweis:
Selbstverständlich müssen stets sowohl die IP als auch -falls aktiviert- die optionalen Sicherheitsfunktionen bei den folgenden Beispielen entsprechend angepasst werden. Ebenso müssen Parameter, die gesetzt werden sollen, schreibbar sein (s. Kap. 2.2).

Solltest du ein anderes System als die im Folgenden aufgeführten verwenden, so würde ich mich über die Zusendung eines Beispielscripts zur Anbindung des Adapters freuen! Sende es mir einfach als .txt-Datei per Email (adapter (ät) quantentunnel.de) zu - danke!


8.1 FHEM

Die FHEM-Beispielscripte zur Einbindung mittels HTTPMOD stammen vom FHEM-Forumsmitglied „freetz”.
Vielen Dank!

Um auf die Webschnittstelle des Adapters zuzugreifen, kann das Modul HTTPMOD in FHEM genutzt werden.

Beispielscript für eine Parameterabfrage und die Übermittlung einer Raumtemperatur:

Der Beispielcode fragt die Parameter 8700, 8743 und 8314 alle 300 Sekunden ab und weist diese dem Gerät "THISION" (Name des Heizungssystems) und den Readings "Aussentemperatur", "Vorlauftemperatur" und "Ruecklauftemperatur" zu.

Darüber hinaus stellt es ein Reading "Istwert" bereit, das per FHEM gesetzt werden kann, um dem Heizungssystem die aktuelle Zimmertemperatur mitzuteilen (Parameter 10000).

Zu guter Letzt berechnet es die Differenz zwischen "Vorlauftemperatur" und "Rücklauftemperatur" und weist diese Differenz dem Reading "Spreizung" zu.

Bitte beachte:
Die RegEx-Bedingungen müssen vom Beginn des Strings an (also der Parameternummer wie bspw. 8700) matchen und nicht erst ab einem späteren Teil des Strings.

Hinweis:
Es scheint ein Problem mit dem HTTPMOD-Modul zu geben, aufgrund dessen Readings nicht erfolgen, die reading0Name und reading0Regex heißen. Bitte beginne daher stets mit 1.

define THISION HTTPMOD http://192.168.178.88/8700/8743/8314 300
attr THISION userattr reading1Name reading1Regex reading2Name reading2Regex reading3Name reading3Regex readingOExpr set1Name set1URL
attr THISION event-on-change-reading .*
attr THISION reading1Name Aussentemperatur
attr THISION reading1Regex 8700 .*:[ \t]+([-]?[\d\.]+)
attr THISION reading2Name Vorlauftemperatur
attr THISION reading2Regex 8743 .*:[ \t]+([-]?[\d\.]+)
attr THISION reading3Name Ruecklauftemperatur
attr THISION reading3Regex 8314 .*:[ \t]+([-]?[\d\.]+)
attr THISION readingOExpr $val=~s/[\r\n]//g;;$val
attr THISION set1Name Istwert
attr THISION set1URL http://192.168.178.88/I10000=$val
attr THISION timeout 5
attr THISION userReadings Spreizung { sprintf("%.1f",ReadingsVal("THISION","Vorlauftemperatur",0)-ReadingsVal("THISION","Ruecklauftemperatur",0));; }

Bei dem obigen Beispiel erfolgt die Darstellung der jeweiligen Readings als numerischer Wert.
Soll die Darstellung wie bei den PullDown-Menüs im Webinterface im Klartext erfolgen, so müssen die regulären Ausdrücke entsprechend angepasst werden.
Im Folgenden ein Beispiel für die Parameter ‘700 - Betriebsart’ und ‘8000 - Status Heizkreis 1’.

attr THISION reading4Name Betriebsart
attr THISION reading4Regex 700 .*-[ \t]+(.*)
attr THISION reading5Name Status Heizkreis 1
attr THISION reading5Regex 8000 .*-[ \t]+(.*)

Die Nummerierung der zuvor aufgeführten Readings wird hierbei weitergeführt, die Readings sind in der Zeile ‘attr THISION userattr’ hinzuzufügen.
Außerdem ist die URL dabei um die Parameter 700 und 8000 zu ergänzen.
Zusammengefasst sieht das Ganze dann so aus:

define THISION HTTPMOD http://192.168.178.88/8700/8743/8314/700/8000 300
attr THISION userattr reading1Name reading1Regex reading2Name reading2Regex reading3Name reading3Regex reading4Name reading4Regex reading5Name reading5Regex readingOExpr set1Name set1URL
attr THISION event-on-change-reading .*
attr THISION reading1Name Aussentemperatur
attr THISION reading1Regex 8700 .*:[ \t]+([-]?[\d\.]+)
attr THISION reading2Name Vorlauftemperatur
attr THISION reading2Regex 8743 .*:[ \t]+([-]?[\d\.]+)
attr THISION reading3Name Ruecklauftemperatur
attr THISION reading3Regex 8314 .*:[ \t]+([-]?[\d\.]+)
attr THISION reading4Name Betriebsart
attr THISION reading4Regex 700 .*-[ \t]+(.*)
attr THISION reading5Name Status Heizkreis 1
attr THISION reading5Regex 8000 .*-[ \t]+(.*)
attr THISION readingOExpr $val=~s/[\r\n]//g;;$val
attr THISION set1Name Istwert
attr THISION set1URL http://192.168.178.88/I10000=$val
attr THISION timeout 5
attr THISION userReadings Spreizung { sprintf("%.1f",ReadingsVal("THISION","Vorlauftemperatur",0)-ReadingsVal("THISION","Ruecklauftemperatur",0));; }

Beispielscript für die Abfrage und Ansteuerung eines Relaisboards:

Das Folgende ist ein Beispiel für eine FHEM-Konfiguration, bei dem die drei Relais-Ports namens "Heater", "Fan" und "Bell" abgefragt und gesteuert werden, die an die entsprechenden GPIO-Pins 7, 6 und 5 angeschlossen sind.

define EthRelais HTTPMOD http://192.168.178.88/G05/G06/G07 30
attr EthRelais userattr reading1Name reading1Regex reading2Name reading2Regex reading3Name reading3Regex readingOExpr readingOMap set1Name set1URL set2Name set2URL set3Name set3URL setIMap setParseResponse:0,1 setRegex
attr EthRelais event-on-change-reading .*
attr EthRelais reading1Name Heater
attr EthRelais reading1Regex GPIO7:[ \t](\d)
attr EthRelais reading2Name Fan
attr EthRelais reading2Regex GPIO6:[ \t](\d)
attr EthRelais reading3Name Bell
attr EthRelais reading3Regex GPIO5:[ \t](\d)
attr EthRelais room Heizung
attr EthRelais set1Name Heater
attr EthRelais set1URL http://192.168.178.88/G07=$val
attr EthRelais set2Name Fan
attr EthRelais set2URL http://192.168.178.88/G06=$val
attr EthRelais set3Name Bell
attr EthRelais set3URL http://192.168.178.88/G05=$val
attr EthRelais setParseResponse 1
attr EthRelais setRegex GPIO[0-9]+:[ \t](\d)
attr EthRelais timeout 5

8.2 openHAB

Bei Verwendung von openHAB >v2.5.4 kann BSB-LAN mittels Binding eingebunden werden - für ältere openHAB-Versionen existiert kein Binding. Mit dem HTTP-Binding und der Javascript Transformation ist es allerdings durchaus möglich, Werte auszulesen und auch zu schreiben.
Ein Loggen der Daten kann bspw. mit InfluxDB erfolgen, die Visualisierung mit Grafana.


8.2.1 openHAB-Binding

BSB-LAN-User „hypetsch“ hat ein Binding für openHAB entwickelt, das offiziell Teil von openHAB ab v2.5.4 ist!
Vielen Dank!


8.2.2 openHAB mit Javascript Transformation

Für openHAB-Versionen <v2.5.4 muss die Einbindung manuell erfolgen, ein Binding existiert für diese alte openHAB-Version nicht.

Die openHAB-Beispielscripte stammen vom FHEM-Forumsmitglied „acfischer42”, zwei Korrekturen/Änderungsvorschläge sowie das Skript zum Anzeigen der Werte in einer Sitemap von „sihui”.
Vielen Dank!

ACHTUNG:
Die notwendigen Addons wie bspw. die Javascript Transformation sind vorhergehend zu installieren!

Beispiel einer Item-Konfiguration:

Number hz_aussentemp "Aussentemperatur [%.1f °C]" <temperature> (Heizunglog) { http="<[http://192.168.178.88/8700:60000:JS(bsbinput.js)]" }
String hz_700 "Heizkreis 1 Betriebsart [%s]" <temperature> (Heizunglog){ http="<[http://192.168.178.88/700:1000:JS(bsbinput_string.js)]" }

Das folgende Javascript ist als bsbinput.js im Verzeichnis transform abzulegen.

Beispielscript für Abfragen von Parametern, bei denen ein Wert ausgegeben wird (bsbinput.js):

(function(i) {
    var outputres;
	var results = [];
	value1 = i;
	// define regex to search for the line in the http response
	var regEx = 'input type=text id=\'value[0-9]+\' VALUE=\'[-]*[0-9]+\.[0-9]+';
	var re = new RegExp(regEx, 'gim');
  
 do {
    match = re.exec(value1);
    if (match){
        results.push(match[0]);
    }
} while (match);
    
	outputres = results[0]
	//extract actual value from the output
	var output=outputres.substr(outputres.indexOf("VALUE='")+7,outputres.length);
	return output;
})(input)

Beispielscript für direkte Abfragen von enum-Werten (bsbinput_string.js):

(function(i) {
        var outputres;
	var results = [];
	value1 = i;
	// define regex to search for the line in the http response
	var regEx = '<option value=\'[0-9]+\' SELECTED>.*</option>';
	var re = new RegExp(regEx, 'gim');
  
 do {
    match = re.exec(value1);
    if (match){
        results.push(match[0]);
    }
} while (match);
    
	outputres = results[0]
	//extract actual value from the output
	var l=outputres.indexOf("</o")-outputres.indexOf(">")-1
	var output=outputres.substr(outputres.indexOf(">")+1,l);
		return output;
})(input)

Das Schreiben von Daten erfolgt über Rules:

rule "RoomTemp"

when
	Item iSet_temp changed
then
	sendHttpGetRequest("http://192.168.178.88/I10000="+iSet_temp.state.toString)
end

Anzeigen der Werte in einer Sitemap (BasicUI, ClassicUI, iOS und Android App):

sitemap demo label="Mein BSB LAN" {
    Frame label="Heizung" {
		Text item=hz_aussentemp
		Text item=hz_700
    }
}

8.2.3 openHAB mit Javascript Transformation, MQTT, Network und Expire

Basierend auf dem vorhergehenden Beispiel hat FHEM-Forumsmitglied „sihui” (GitHub: sihui62) ein erweitertes Beispiel erstellt.
Vielen Dank!

ACHTUNG:
Die notwendigen Addons wie bspw. die Javascript Transformation, MQTT, Network und Expire sind vorhergehend zu installieren! Auf das Anlegen der ggf. notwendigen Things über PaperUI wird ebenfalls nicht näher eingegangen.

Hinweis:
Das folgende Beispiel muss selbstverständlich individuell angepasst werden. Dabei ist insbesondere darauf zu achten, dass gewisse heizungsseitige Parameter/Funktionen nicht bei jedem Gerät verfügbar sind!
Des Weiteren kann eine Anzeige der Raumtemperatur nur dann erfolgen, wenn diese auch übermittelt wird (bspw. durch ein entspr. Raumgerät).
Die Präsenztastenfunktion kann u.U. bei einigen Reglertypen nicht gegeben sein (s. entspr. Kap.) und sollte daher im Vorfeld überprüft werden.
MAX!-Komponenten können selbstverständlich ebenfalls nur genutzt werden, wenn sie vorhandenen und entspr. eingebunden sind (s. entspr. Kap.).

Das folgende Beispiel wird als Sitemap in BasicUI wie in folgendem Screenshot angezeigt:

OpenHab sitemap

Beispiel einer Item-Konfiguration (/items/bsblan.items):

Number hz_mode_cmd <heating> //change heating mode
String hz_mode_state <heating> { http="<[http://192.168.178.88/700:10000:JS(bsbinput_string.js)]" } //read heating mode from BSB LAN Adapter
Number hz_temperature_cmd <temperature> //change target temperature
Number hz_temperature_state <temperature> { http="<[http://192.168.178.88/8741:15000:JS(bsbinput.js)]" } //read current target temperature from BSB LAN Adapter
String hz_status <heating> { http="<[http://192.168.178.88/8000:20000:JS(bsbinput_string.js)]" } //read current heating status from BSB LAN Adapter
String hz_status_water <water> { http="<[http://192.168.178.88/8003:25000:JS(bsbinput_string.js)]" } //read current hot water status from BSB LAN Adapter
Switch hz_mode_komfort <switch> { expire="1s,command=OFF" } //ONLY if Parameter 48 is available on your controller: set temporary Komfort state during Automatik mode, switch item to OFF after one second (momentary switch)
Switch hz_mode_reduziert <switch> { expire="1s,command=OFF" } //ONLY if Parameter 48 is available on your controller: set temporary Reduziert state during Automatik mode, switch item to OFF after one second (momentary switch)
Number hz_temperature_rgt <temperature> { http="<[http://192.168.178.88/8740:25000:JS(bsbinput.js)]" } //read current room temperature for remote RGT from BSB LAN Adapter
Number hz_fan_speed <fan> { http="<[http://192.168.178.88/8323:30000:JS(bsbinput.js)]" } //read current fan speed from BSB LAN Adapter
Number hz_aussentemp <temperature> { http="<[http://192.168.178.88/8700:20000:JS(bsbinput.js)]" } //read current outside temperature from BSB LAN Adapter via Javascript Transformation (not used here)
Number hz_kitchen_maxActual "MAX! Küche [%.1f °C]" {channel="max:thermostat:KEQ0565026:KEQ0648949:actual_temp"} //read temperature from MAX!
Number BSBLAN_Aussentemp <temperature> { channel="mqtt:topic:bsblan:aussentemp" } //read current outside temperature from BSB LAN Adapter via MQTT2
Number BSBLAN_Vorlauftemp <temperature> { channel="mqtt:topic:bsblan:vorlauftemp" } //read current flow temperature from BSB LAN Adapter via MQTT2
Number BSBLAN_Ruecklauftemp <temperature> { channel="mqtt:topic:bsblan:ruecklauftemp" } //read current return temperature from BSB LAN Adapter via MQTT2
Switch bsb_lan_presence <presence> { channel="network:pingdevice:192_168_178_88:online" } //check online status of BSB LAN through Network binding
Number hz_mode_party <party> //enable or disable Party mode for 1-5 hours

Das folgende Javascript ist als bsbinput.js im Verzeichnis transform abzulegen.

Beispielscript für Abfragen von Parametern, bei denen ein Wert ausgegeben wird (/transform/bsbinput.js):

(function(i) {
    var outputres;
	var results = [];
	value1 = i;
	// define regex to search for the line in the http response
	var regEx = 'input type=text id=\'value[0-9]+\' VALUE=\'[-]*[0-9]+\.[0-9]+';
	var re = new RegExp(regEx, 'gim');
  
 do {
    match = re.exec(value1);
    if (match){
        results.push(match[0]);
    }
} while (match);
    
	outputres = results[0]
	//extract actual value from the output
	var output=outputres.substr(outputres.indexOf("VALUE='")+7,outputres.length);
	return output;
})(input)

Beispielscript für direkte Abfragen von enum-Werten (/transform/bsbinput_string.js):

(function(i) {
        var outputres;
	var results = [];
	value1 = i;
	// define regex to search for the line in the http response
	var regEx = '<option value=\'[0-9]+\' SELECTED>.*</option>';
	var re = new RegExp(regEx, 'gim');
  
 do {
    match = re.exec(value1);
    if (match){
        results.push(match[0]);
    }
} while (match);
    
	outputres = results[0]
	//extract actual value from the output
	var l=outputres.indexOf("</o")-outputres.indexOf(">")-1
	var output=outputres.substr(outputres.indexOf(">")+1,l);
		return output;
})(input)

Das Schreiben und Auslesen von Daten erfolgt über Rules (/rules/bsblan.rules):

var Timer PartyModeTimer = null //initialize a timer for party mode

rule "HeatingTempTarget" //change target temperature
when
	Item hz_temperature_cmd changed
then
	sendHttpGetRequest("http://192.168.178.88/S710="+hz_temperature_cmd.state.toString)
end

rule "HeatingMode" //change heating mode
when
	Item hz_mode_cmd changed
then
	sendHttpGetRequest("http://192.168.178.88/S700="+hz_mode_cmd.state.toString)
end

rule "UpdateHeatingMode" //reflect manual RGT remote changes on UI
when
	Item hz_mode_state changed
then
	hz_mode_cmd.postUpdate(transform("MAP","heatingmode.map",hz_mode_state.state.toString))
end

rule "SetModeKomfort" //set mode temporary to Komfort during Automatik mode
when
	Item hz_mode_komfort changed to ON
then
	sendHttpGetRequest("http://192.168.178.88/S701=0")
end

rule "SetModeReduziert" //set mode temporary to Reduziert during Automatik mode
when
	Item hz_mode_reduziert changed to ON
then
	sendHttpGetRequest("http://192.168.178.88/S701=1")
end

rule "SetPartyMode" //extends heating Komfort time for 1-5 hours
when
	Item hz_status changed
then
	// to do: read shutdown times for Absenkung Reduziert dynamically from BSB LAN Adapter
	if (hz_status.state.toString=="Absenkung Reduziert" && (now.getHourOfDay()>=22 && (now.getHourOfDay()<=23))) { //only trigger rule content during normal Reduziert shutdown times
		switch (hz_mode_party.state) {
				case 1: {
				if(PartyModeTimer!==null) {
           		PartyModeTimer.cancel
           		PartyModeTimer = null
        		}
					PartyModeTimer = createTimer(now.plusHours(1)) [ |
					hz_mode_cmd.sendCommand(1)
					logInfo("BSBLAN","Party Mode disabled")
					]
				hz_mode_cmd.sendCommand(3)
				hz_mode_party.postUpdate(0)
				logInfo("BSBLAN","Party Mode 1h")
				}		
				case 2: {
				if(PartyModeTimer!==null) {
           		PartyModeTimer.cancel
           		PartyModeTimer = null
        		}
					PartyModeTimer = createTimer(now.plusHours(2)) [ |
					hz_mode_cmd.sendCommand(1)
					logInfo("BSBLAN","Party Mode disabled")
					]
				hz_mode_cmd.sendCommand(3)
				hz_mode_party.postUpdate(0)
				logInfo("BSBLAN","Party Mode 2h")
				}
				case 3: {
				if(PartyModeTimer!==null) {
           		PartyModeTimer.cancel
           		PartyModeTimer = null
        		}
					PartyModeTimer = createTimer(now.plusHours(3)) [ |
					hz_mode_cmd.sendCommand(1)
					logInfo("BSBLAN","Party Mode disabled")
					]
				hz_mode_cmd.sendCommand(3)
				hz_mode_party.postUpdate(0)
				logInfo("BSBLAN","Party Mode 3h")
				}	
				case 4: {
				if(PartyModeTimer!==null) {
           		PartyModeTimer.cancel
           		PartyModeTimer = null
        		}
					PartyModeTimer = createTimer(now.plusHours(4)) [ |
					hz_mode_cmd.sendCommand(1)
					logInfo("BSBLAN","Party Mode disabled")
					]
				hz_mode_cmd.sendCommand(3)
				hz_mode_party.postUpdate(0)
				logInfo("BSBLAN","Party Mode 4h")
				}
				case 5: {
				if(PartyModeTimer!==null) {
           		PartyModeTimer.cancel
           		PartyModeTimer = null
        		}
					PartyModeTimer = createTimer(now.plusHours(5)) [ |
					hz_mode_cmd.sendCommand(1)
					logInfo("BSBLAN","Party Mode disabled")
					]
				hz_mode_cmd.sendCommand(3)
				hz_mode_party.postUpdate(0)
				logInfo("BSBLAN","Party Mode 5h")
				}
			}
	}
end

rule "ConsiderRoomTempFromKitchen" //feed external temperatures to controller, for example MAX!
when
	Item hz_kitchen_maxActual changed
then
	sendHttpGetRequest("http://192.168.178.88/I10000="+hz_kitchen_maxActual.state.toString)
end

Transformation von Zahlenwerten zu besser lesbaren Texten (/transform/heatingmode.map):

Automatik=1
Reduziert=2
Komfort=3
Schutzbetrieb=0

Anzeigen der Werte in einer Sitemap (/sitemaps/bsblan.sitemap, z.B. für BasicUI, ClassicUI, iOS und Android App):

sitemap bsblan label="Mein BSB LAN"
{
Frame	{
			Text label="Heizung" icon="heating"
				{
				Text item=hz_mode_state label="IST Betriebsart [%s]"
				Selection item=hz_mode_cmd label="SOLL Betriebsart [%s]" mappings=[1="Automatik",3="Komfort",2="Reduziert"]
				Text item=hz_temperature_state label="Gesetzte Temperatur [%.1f °C]"
				Setpoint item=hz_temperature_cmd label="SOLL Temperatur [%.1f °C]" minValue=16 maxValue=24 step=0.5
				Text item=hz_status label="Status Heizung [%s]"
				Text item=hz_status_water label="Status Wasser [%s]"
				Switch item=hz_mode_komfort label="Präsenz Komfort"
				Switch item=hz_mode_reduziert label="Präsenz Reduziert"
				Selection item=hz_mode_party label="Partymodus [%s]" mappings=[0="Aus",1="1h",2="2h",3="3h",4="4h",5="5h"]
				Text item=hz_temperature_rgt label="Raumtemperatur RGT [%.1f °C]"
				Text item=hz_kitchen_maxActual label="MAX! Küche [%.1f °C]"
				Text item=BSBLAN_Aussentemp label="Aussentemperatur [%.1f °C]"
				Text item=BSBLAN_Vorlauftemp label="Vorlauftemperatur [%.1f °C]"
				Text item=BSBLAN_Ruecklauftemp label="Rücklauftemperatur [%.1f °C]"
				Text item=bsb_lan_presence label="BSB LAN Online Status [%s]"
				Text item=hz_fan_speed label="Gebläsedrehzahl [%d U/min]"
				}
		}
}

8.3 HomeMatic (EQ3)

Die folgenden HomeMatic-Beispielscripte stammen vom FHEM-Forumsmitglied „Bratmaxe”.
Sie sind samt einer genaueren Beschreibung ebenfalls hier im FHEM-Forum zu finden (die hier eingefügten Beschreibungen wurden von dort größtenteils unverändert übernommen).

Das letzte Beispiel beinhaltet die Abfrage optional angeschlossener DS18B20-Temperatursensoren mittels der spezifischen SensorIDs und der Ausgabe von /T.
Im Anschluss daran sind die Beispielskripte vom FHEM-Forumsmitglied “PaulM” aufgeführt.
Vielen Dank!

Beispielscript für die Abfrage des Adapters:

Es müssen lediglich 6 Parameter eingegeben werden.
CuxGeraetAbfrage = GeräteAdresse des CuxD Execute Gerätes, welches die Abfragen ausführt
CuxGeraetLogging = GeräteAdresse des CuxD Execute Gerätes, welches das Logging ausführt (leer==deaktiviert)
IPAdresseBSB = IP-Adresse des BSB-Adapters
Wort = Parameternummer: Beispiel Außentemperatur = 8700 oder Betriebsmodus = 700
Variablename = Name der Systemvariable in der CCU
Durchschnitt24h = true == Durchschnittswert 24h holen, false == aktuellen Wert holen

Es muss keine Variable vorher angelegt werden, das erledigt das Skript.
Der Variabeltyp (Zahl, Bool, Werteliste) wird automatisch an den abgefragten Parameter angepasst.

! BSB-Adapter Wert abfragen by Bratmaxe
! 29.10.2018 - V0.1 - Erste Version

string CuxGeraetAbfrage = "CUX2801001:1"; ! GeräteAdresse des CuxD Execute Gerätes, welches die Abfragen ausführt
string CuxGeraetLogging = "CUX2801001:1"; ! GeräteAdresse des CuxD Execute Gerätes, welches das Logging ausführt, Leer ("") lassen, wenn kein Cuxd-Highcharts Logging gewünscht
string IPAdresseBSB = "192.168.178.100"; !IP_Adresse des BSB-Adapters
string Wort = "8700"; !Parameternummer: Beispiel Außentemperatur = 8700, Betriebsmodus = 700
string Variablename = "Wetter_Temperatur_Heizung"; ! Name der Systemvariable
boolean Durchschnitt24h = false; ! true = Durchschnittswert holen, false = aktuellen Wert holen - diese muss vorher in der BSB_lan_config.h konfiguriert wurden sein!!!

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!Ab hier keine Anpassungen mehr notwendig!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! URL Zusammenführen
string url="";
if (Durchschnitt24h) { url="http://" # IPAdresseBSB # "/A" # Wort; }
else { url="http://" # IPAdresseBSB # "/" # Wort; }
! Variable anlegen, wenn nicht vorhanden:
object svObject = dom.GetObject(Variablename);
object svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
if (!svObject)
{
    svObject = dom.CreateObject(OT_VARDP);
    svObjectlist.Add(svObject.ID());
	svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObject.Name(Variablename);   
    svObject.Internal(false);
    svObject.Visible(true);
}

! Werte holen
dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'"); 
dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_QUERY_RET").State(1);
var stdout = dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_RETS").State();

! Prüfe, ob eine Ausgabe vorhanden ist, sonst z.B. IP-Adresse falsch, oder Netzwerkfehler
if (stdout != null && stdout != "")
{
	! Ausgabe filtern
	integer pos = (stdout.Find(Wort# " "));	
	if (pos == -1)
	{
		WriteLine("Position vom Wort '" # Wort # "' konnte nicht ermittelt werden");
	}
	
	stdout = stdout.Substr(pos, stdout.Length());
	pos = stdout.Find("/td");
	stdout = stdout.Substr(0, pos);
	
	! Sonderzeichen ersetzen
	if (stdout.Contains("&deg;")){ stdout = stdout.Replace("&deg;","°"); }
	if (stdout.Contains("&#037;")){ stdout = stdout.Replace("&#037;","%"); }
	stdout = stdout.ToLatin();
	!WriteLine("Nach Sonderzeichenumwandlung: " # stdout); !Debug: Welchen Wert hat stdout aktuell

	! Systemvariabel Info ermitteln
	string Info = stdout.Substr(0,stdout.Find(":"));
	!Info = Info.Substr(Wort.Length(), stdout.Length()); !Parameterzahl vor der Info entfernen
	!WriteLine("DPInfo = " # Info); !Debug: Welcher DPInfo-Wert wurde gefunden
	
	! Systemvariabel Wert ermitteln
	string Wert = stdout.Substr(stdout.Find(": ") + 2,stdout.Length());
	Wert = Wert.Substr(0,Wert.Find(" "));
	!WriteLine("Wert = " # Wert); !Debug: Welcher Wert wurde gefunden

	! Systemvariabel Einheit ermitteln
	string Einheit = stdout.Substr(stdout.Find(Info) + Info.Length() + 1, stdout.Length());
	Einheit = Einheit.Substr(Einheit.Find(Wert) + Wert.Length() + 1,Einheit.Length());
	Einheit = Einheit.RTrim();
	if (Einheit.Contains("- "))	{ Einheit = ""; }
	!WriteLine("Einheit = " # Einheit); !Debug: Welche Einheit wurde gefunden

	! Systemvariable Typ und Werte setzen
	svObject.DPInfo(Info);
	svObject.ValueUnit(Einheit);
	
	! Enums des Parameters ermitteln, wenn vorhanden
	url="http://" # IPAdresseBSB # "/E" # Wort;

	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'"); 
	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_QUERY_RET").State(1);
	stdout = dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_RETS").State();
	! Prüfe, ob es sich um einen Parameter mit Enum-Werten handelt.
	if (!stdout.Contains("FEHLER: Falscher Typ!"))
	{
		! Setzen des Systemvariabel Wertetyp und Ermitteln der Enum-Werte des Parameters
		stdout = (stdout.Substr(stdout.Find("0 - "), stdout.Length())).ToLatin();
		string value = "";
		string newvalues = "";
		integer inewvalues=0;
		foreach (value, stdout.Split("\r"))
		{
			if (value.Contains(" - "))
			{
				if (newvalues == "") { newvalues = newvalues # value.Substr(value.Find(" - ") + 3,value.Length()); }
				else { newvalues = newvalues # ";" # value.Substr(value.Find(" - ") + 3,value.Length()); }
				inewvalues = inewvalues + 1;
			}
		}
		
		svObject.ValueType(ivtInteger);
		svObject.ValueSubType(istEnum);
		svObject.ValueList(newvalues);
		!prüft, ob der ermittelte Wert innerhalbe der möglichen Werte liegt
		if (Wert < inewvalues) { if (Wert != svObject.Value()) { svObject.State(Wert); } }
		else { WriteLine("Der ermittelte Wert entspricht keinem gültigen Enum-Wert. Bitte Ausgabe prüfen!") }
	}
	elseif (Einheit.Contains("- Aus") || Einheit.Contains("- Ein"))
	{
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtBinary);
		svObject.ValueSubType(istBool);
		svObject.ValueName0("Aus");
		svObject.ValueName1("Ein");
		if (Wert != svObject.Value()) {	svObject.State(Wert); }
	}
	elseif (Einheit.Contains("°"))
	{
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.ValueMin(-50);
		svObject.ValueMax(100);
		if (Wert != svObject.Value()) {	svObject.State(Wert); }
	}
	elseif (Einheit.Contains("%"))
	{
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.ValueMin(0);
		svObject.ValueMax(100);
		if (Wert != svObject.Value()) {	svObject.State(Wert); }
	}
	else
	{
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		if (Wert != svObject.Value()) {	svObject.State(Wert); }
	}
	dom.RTUpdate(0); ! Interne Aktualisierung der Systemvariabelen

	! Logging
	if (CuxGeraetLogging != "")	{ dom.GetObject("CUxD."#CuxGeraetLogging#".LOGIT").State(dom.GetObject(ID_SYSTEM_VARIABLES).Get(Variablename).Name()#";"#dom.GetObject(ID_SYSTEM_VARIABLES).Get(Variablename).Value());	}
}

Skript zum Setzen von Parametern:

Ein Programm, wo alle Systemvariabeln die überwacht werden sollen mit ODER Verknüpft und größer oder gleich 0 und “bei Aktualisierung auslösen”, anlegen.
Beispiel:

WENN Variablename größer oder gleich 0 "bei Aktualisierung auslösen"
DANN Dieses SKRIPT sofort ausführen

Die Variable muss in der Info zuerst den ParameterWert enthalten (wird vom obigen Auslese-Skript automatisch so benannt). Beispiel: 700 Heizkreis 1 - Betriebsart
Die Parameternummer wird dann automatisch aus der Systemvariable Info ermittelt.
Wird die Variable geändert, so wird der geänderte Wert automatisch an den BSB-Adapter übermittelt und aktualisiert!

! BSB-Adapter Wert setzen by Bratmaxe
! 29.10.2018 - V0.1 - Erste Version

! Funktionsbeschreibung:
! Ein Programm, wo alle Systemvariabeln die Überwacht werden sollen mit ODER Verknüpft und größer oder gleich 0 und  "bei Aktualisierung auslösen" , anlegen.
! Beispiel:
! WENN Variablename größer oder gleich 0 "bei Aktualisierung auslösen"
! DANN Dieses SKRIPT sofort ausführen
! die Variable muss in der Info zuerst den Parameter-Wert enthalten (wird von meinem Auslese Skript automatisch so benannt. Beispiel: 700 Heizkreis 1 - Betriebsart
! Die Parameternummer wird dann automatisch aus der Systemvariable Info ermittelt.
! Wird die Variable geändert, so wird der geänderte Wert automatisch an den BSB-Adapter übermittelt und aktualisiert!

string CuxGeraetSetzen = "CUX2801001:12"; ! GeräteAdresse des CuxD Execute Gerätes
string IPAdresseBSB = "192.168.2.200"; !IP_Adresse des BSB-Adapters

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!Ab hier keine Anpassungen mehr notwendig!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! Hole Auslösende Variabel
var source = dom.GetObject("$src$"); !Funktioniert nur beim automatischen Aufruf
! Zum manuellen Aufruf/testen nächste Zeile einkommentieren
!source = dom.GetObject(ID_SYSTEM_VARIABLES).Get("VARIABLENAMEN");

if (source)
{
	! Wort ermitteln
	string Wort = source.DPInfo().ToString().Substr(0,source.DPInfo().Find(" "));
	!WriteLine("Wort: "#Wort);
	if (Wort != null && Wort != "")
	{		
		string Wert = source.Value().ToString();
		!WriteLine("Wert: "#Wert);
		if (Wert != null && Wert != "")
		{
			! Anweisung senden
			string urlset="http://" # IPAdresseBSB # "/S" # Wort # "=" # Wert;
			dom.GetObject("CUxD." # CuxGeraetSetzen # ".CMD_SETS").State("wget -t 5 -T 20 -q -O - '"# urlset #"'");
			dom.GetObject("CUxD." # CuxGeraetSetzen # ".CMD_QUERY_RET").State(1);
			var stdout = dom.GetObject("CUxD." # CuxGeraetSetzen # ".CMD_RETS").State();
			if (stdout != null && stdout != "")
			{
				if (stdout.Contains("FEHLER: "))
				{
					stdout = stdout.Substr(stdout.Find("FEHLER: "), stdout.Length());
					stdout = stdout.Substr(0, stdout.Find("/td"));
					WriteLine("Fehlermeldung: "# stdout);
					WriteLine("Wurde der BSB-Adapter zum Schreiben berechtigt? Handbuch Seite 26 beachten...");
				}
				else
				{
					! Kontrollabfrage
					string url="http://" # IPAdresseBSB # "/" # Wort;
					dom.GetObject("CUxD." # CuxGeraetSetzen # ".CMD_SETS").State("wget -t 5 -T 20 -q -O - '"# url #"'");
					dom.GetObject("CUxD." # CuxGeraetSetzen # ".CMD_QUERY_RET").State(1);
					stdout = dom.GetObject("CUxD." # CuxGeraetSetzen # ".CMD_RETS").State();

					! Ausgabe filtern
					integer pos = (stdout.Find("tr  td \r\n" # Wort # " ") + 9);
					stdout = stdout.Substr(pos, stdout.Length());
					pos = stdout.Find("/td");
					stdout = stdout.Substr(0, pos);
					
					! Sonderzeichen ersetzen
					if (stdout.Contains("&deg;")){ stdout = stdout.Replace("&deg;","°"); }
					if (stdout.Contains("&#037;")){ stdout = stdout.Replace("&#037;","%"); }
					!WriteLine("Nach Sonderzeichenumwandlung: " # stdout); !Debug: Welchen Wert hat stdout aktuell
					
					! Systemvariabel oldWert ermitteln
					string oldWert = stdout.Substr(stdout.Find(": ") + 2,stdout.Length());
					oldWert = oldWert.Substr(0,oldWert.Find(" "));
					!WriteLine("oldWert = " # oldWert.ToFloat()); !Debug: Welcher oldWert wurde gefunden
					!WriteLine("newWert = " # Wert.ToFloat()); !Debug: Welcher oldWert wurde gefunden
					
					if (Wert.ToFloat() != oldWert.ToFloat()) { WriteLine("Fehler: Werte stimmen nach setzen nicht überein!"); }	
					else { WriteLine("Wert wurde erfolgreich gesetzt");	}
				}
			}
			else { WriteLine("Keine Ausgabe gefunden. IP-Adresse und Verkabelung prüfen.");	}
		}
		else { WriteLine("Der neue Wert konnte nicht ermittelt werden.");	}
	}
	else { WriteLine("Wort konnte nicht ermittelt werden, Steht der Wert in der SystemvariableInfo am Anfang gefolgt von einem Leerzeichen?");	}
}
else { WriteLine("Auslösende Variable nicht erkannt! - Skript wird nicht ausgeführt.");	}

Abfrage von heizungsseitigen Fehlermeldungen zwecks Benachrichtigung im Störungsfall:

! BSB-Adapter Wert abfragen Fehlercodes by Bratmaxe
! 05.11.2018 - V0.1 - Erste Version

string CuxGeraetAbfrage = "CUX2801001:1"; ! GeräteAdresse des CuxD Execute Gerätes, welches die Abfragen ausführt
string IPAdresseBSB = "192.168.178.100"; !IP_Adresse des BSB-Adapters
string Variablename = "Heizung_Fehlercodes"; ! Name der Systemvariable
integer AnzahlFehler = 10;

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!Ab hier keine Anpassungen mehr notwendig!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! Parameter Zusammenbauen
integer i =0;
string Woerter ="";
while (i < AnzahlFehler)
{
	if (Woerter != "")
	{
		Woerter = Woerter + "," + ((6801) + (10 * i)).ToString();
	}
	else { Woerter = Woerter + ((6801) + (10 * i)).ToString(); }
	i = i + 1;
}

! URL Zusammenführen
string Ergebnis = "";
string Wort = "";

foreach(Wort, Woerter.Split(","))
{
	string url="http://" # IPAdresseBSB # "/" # ((Wort.ToInteger() - 1).ToString());
	
	! Werte holen
	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'"); 
	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_QUERY_RET").State(1);
	var stdout = dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_RETS").State();
	
	! Prüfe, ob eine Ausgabe vorhanden ist, sonst z.B. IP-Adresse falsch, oder Netzwerkfehler
	if (stdout != null && stdout != "")
	{
		! Ausgabe filtern
		integer pos = (stdout.Find((Wort.ToInteger() - 1).ToString() #  " "));	
		stdout = stdout.Substr(pos, stdout.Length());
		pos = stdout.Find("/td");
		stdout = stdout.Substr(0, pos);
		
		! Sonderzeichen ersetzen
		if (stdout.Contains("°")){ stdout = stdout.Replace("°","°"); }
		if (stdout.Contains("%")){ stdout = stdout.Replace("%","%"); }
		stdout = stdout.ToLatin();
		Ergebnis = Ergebnis # stdout.RTrim() # "\n\r";
	}

	url="http://" # IPAdresseBSB # "/" # Wort;	
	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'"); 
	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_QUERY_RET").State(1);
	stdout = dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_RETS").State();

	! Prüfe, ob eine Ausgabe vorhanden ist, sonst z.B. IP-Adresse falsch, oder Netzwerkfehler
	if (stdout != null && stdout != "")
	{
		! Ausgabe filtern
		integer pos = (stdout.Find(Wort# " "));	
		stdout = stdout.Substr(pos, stdout.Length());
		pos = stdout.Find("/td");
		stdout = stdout.Substr(0, pos);
		
		! Sonderzeichen ersetzen
		if (stdout.Contains("°")){ stdout = stdout.Replace("°","°"); }
		if (stdout.Contains("%")){ stdout = stdout.Replace("%","%"); }
		stdout = stdout.ToLatin();
		Ergebnis = Ergebnis # stdout.RTrim() # "\n\r\n\r";
	}
}

!Wenn noch keine Systemvarible vorhanden, diese anlegen
object svObject = dom.GetObject(Variablename);
object svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
if (!svObject)
{   
    svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObject = dom.CreateObject(OT_VARDP);
    svObjectlist.Add(svObject.ID());
    svObject.Name(Variablename);   
    svObject.ValueType(ivtString);
    svObject.ValueSubType(istChar8859);
    svObject.DPInfo("Die letzen 20 Fehlercodes der Heizung");
    svObject.Internal(false);
    svObject.Visible(true);
    dom.RTUpdate(0);
}

if (Ergebnis.ToLatin() != svObject.Value().ToLatin()) { svObject.State(Ergebnis); }

Abfrage von Parametern und zusätzlich angeschlossenen DS18B20-Sensoren mittels spezifischer SensorID und der Ausgabe von /T:

! BSB-Adapter Wert abfragen by Bratmaxe
! 29.10.2018 - V0.1 - Erste Version
! 11.11.2019 - V0.2 - Auslesen von Temperatursensoren hinzugefügt
! 15.11.2019 - V0.3 - Änderung der Ausleseart der Temperatursensoren mithilfe der ID 

string CuxGeraetAbfrage = "CUX2801001:11"; ! GeräteAdresse des CuxD Execute Gerätes, welches die Abfragen ausführt
string CuxGeraetLogging = "CUX2801001:10"; ! GeräteAdresse des CuxD Execute Gerätes, welches das Logging ausführt, Leer ("") lassen, wenn kein Cuxd-Highcharts Logging gewünscht
string IPAdresseBSB = "192.168.178.88"; !IP_Adresse des BSB-Adapters
string Wort = "T"; !Parameternummer: Beispiel Außentemperatur = 8700, Betriebsmodus = 700, eigene Temperatursensoren = T
string TemperatursensorID = "28aa44085414010b"; !Wenn Wort = "T", dann hier die ID des auszulesenden Temperatursensors eingeben, wird sonst ignoriert!
string Variablename = "Wetter_Temperatur"; ! Name der Systemvariable
boolean Durchschnitt24h = false; ! true = Durchschnittswert holen, false = aktuellen Wert holen - diese muss vorher in der BSB_lan_config.h konfiguriert wurden sein!!! (Bei Wort = T wird dieser Parameter ignoriert)

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!Ab hier keine Anpassungen mehr notwendig!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

! URL Zusammenführen
string url="";
if (Durchschnitt24h && Wort != "T") 
{ 
	url="http://" # IPAdresseBSB # "/A" # Wort; 
}
else 
{ 
	url="http://" # IPAdresseBSB # "/" # Wort; 
}

! Variable anlegen, wenn nicht vorhanden:
object svObject = dom.GetObject(Variablename);
object svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
if (!svObject)
{
    svObject = dom.CreateObject(OT_VARDP);
    svObjectlist.Add(svObject.ID());
	svObjectlist = dom.GetObject(ID_SYSTEM_VARIABLES);
    svObject.Name(Variablename);   
    svObject.Internal(false);
    svObject.Visible(true);
}

! Werte holen
dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'");  
dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_QUERY_RET").State(1);
var stdout = dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_RETS").State();

! Prüfe, ob eine Ausgabe vorhanden ist, sonst z.B. IP-Adresse falsch, oder Netzwerkfehler
if (stdout != null && stdout != "")
{
	integer pos = (stdout.Find(Wort# " "));	
	
	! Ausgabe filtern
	if (Wort == "T")
	{
		pos = (stdout.Find(TemperatursensorID # ": "));	
	}

	if (pos == -1)
	{
		WriteLine("Position vom Wort '" # Wort # "' konnte nicht ermittelt werden");
	}
	
	stdout = stdout.Substr(pos, stdout.Length());
	pos = stdout.Find("/td");
	stdout = stdout.Substr(0, pos);
	
	! Sonderzeichen ersetzen
	if (stdout.Contains("&deg;")){ stdout = stdout.Replace("&deg;","°"); } !& d e g ; ohne Leerzeichen
	if (stdout.Contains("%")){ stdout = stdout.Replace("%","%"); } !& # 0 3 7 ; ohne Leerzeichen
	!WriteLine("Nach Sonderzeichenumwandlung: " # stdout); !Debug: Welchen Wert hat stdout aktuell

	! Systemvariabel Info ermitteln
	string Info = "";
	if (Wort == "T")
	{
		Info = "SensorID: " + TemperatursensorID;
	}
	else
	{
		Info = stdout.Substr(0,stdout.Find(":"));
	}
	!Info = Info.Substr(Wort.Length(), stdout.Length());
	!WriteLine("DPInfo = " # Info); !Debug: Welcher DPInfo-Wert wurde gefunden
	
	! Systemvariabel Wert ermitteln
	string Wert = stdout.Substr(stdout.Find(": ") + 2,stdout.Length());
	Wert = Wert.Substr(0,Wert.Find(" "));
	!WriteLine("Wert = " # Wert); !Debug: Welcher Wert wurde gefunden

	! Systemvariabel Einheit ermitteln
	string Einheit = stdout.Substr(stdout.Find(Info) + Info.Length() + 1, stdout.Length());
	Einheit = Einheit.Substr(Einheit.Find(Wert) + Wert.Length() + 1,Einheit.Length());
	Einheit = Einheit.RTrim();
	if (Einheit.Contains("- "))	{ Einheit = ""; }
	!WriteLine("Einheit = " # Einheit); !Debug: Welche Einheit wurde gefunden

	! Systemvariable Typ und Werte setzen
	svObject.DPInfo(Info);
	svObject.ValueUnit(Einheit);
	
	! Enums des Parameters ermitteln, wenn vorhanden
	url="http://" # IPAdresseBSB # "/E" # Wort;

	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'");  
	dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_QUERY_RET").State(1);
	stdout = dom.GetObject("CUxD." # CuxGeraetAbfrage # ".CMD_RETS").State();
	! Prüfe, ob es sich um einen Parameter mit Enum-Werten handelt.
	if (!stdout.Contains("FEHLER: Falscher Typ!"))
	{
		! Setzen des Systemvariabel Wertetyp und Ermitteln der Enum-Werte des Parameters
		stdout = (stdout.Substr(stdout.Find("0 - "), stdout.Length())).ToLatin();
		string value = "";
		string newvalues = "";
		integer inewvalues=0;
		foreach (value, stdout.Split("\r"))
		{
			if (value.Contains(" - "))
			{
				if (newvalues == "") { newvalues = newvalues # value.Substr(value.Find(" - ") + 3,value.Length()); }
				else { newvalues = newvalues # ";" # value.Substr(value.Find(" - ") + 3,value.Length()); }
				inewvalues = inewvalues + 1;
			}
		}
		
		svObject.ValueType(ivtInteger);
		svObject.ValueSubType(istEnum);
		svObject.ValueList(newvalues);
		!prüft, ob der ermittelte Wert innerhalbe der möglichen Werte liegt
		if (Wert < inewvalues) { if (Wert != svObject.Value()) { if (Wert != "") { svObject.State(Wert); }} }
		else { WriteLine("Der ermittelte Wert entspricht keinem gültigen Enum-Wert. Bitte Ausgabe prüfen!") }
	}
	elseif (Einheit.Contains("- Aus") || Einheit.Contains("- Ein"))
	{ 
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtBinary);
		svObject.ValueSubType(istBool);
		svObject.ValueName0("Aus");
		svObject.ValueName1("Ein");
		if (Wert != svObject.Value()) {	if (Wert != "") { svObject.State(Wert); } }
	}
	elseif (Einheit.Contains("°"))
	{ 
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.ValueMin(-50);
		svObject.ValueMax(100);
		if (Wert != svObject.Value()) {	if (Wert != "") { svObject.State(Wert); } }
	}
	elseif (Einheit.Contains("%"))
	{ 
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		svObject.ValueMin(0);
		svObject.ValueMax(100);
		if (Wert != svObject.Value()) {	if (Wert != "") { svObject.State(Wert); } }
	}
	else
	{ 
		! Setzen des Systemvariabel Wertetyp
		svObject.ValueType(ivtFloat);
		svObject.ValueSubType(istGeneric);
		if (Wert != svObject.Value()) {	if (Wert != "") { svObject.State(Wert); } }
	}
	dom.RTUpdate(0); ! Interne Aktualisierung der Systemvariabelen

	! Logging
	if (CuxGeraetLogging != "")	{ dom.GetObject("CUxD."#CuxGeraetLogging#".LOGIT").State(dom.GetObject(ID_SYSTEM_VARIABLES).Get(Variablename).Name()#";"#dom.GetObject(ID_SYSTEM_VARIABLES).Get(Variablename).Value());	}
}

Die folgenden HomeMatic-Beispielscripte stammen vom FHEM-Forumsmitglied „PaulM”.
Sie sind ebenfalls hier im FHEM-Forum zu finden.
Vielen Dank!

Zur Einbindung in HomeMatic bietet sich die Verwendung von CuxD und wget an.

Beispiel zur Abfrage des Parameters ‚8326 Brennermodulation’ mittels CuxD:

! Skriptanfang:
! BSB-Abfrage
string url='http://192.168.178.88/8326'; !IP anpassen
! WriteLine("URL: " # url); !nur Kontrolle
! --timeout=seconds  ! während der Dauer der Abfrage werden von der CCU 
! keine anderen Skripte ausgeführt !!! 
! siehe CUxD-Handbuch 5.8.2 System.Exec
! dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State
! ("wget -t 5 -T 20 -q -O - '"# url #"'");  ! abgekürzte Wget Syntax
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'");  
! ausführliche Wget Syntax
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
! WriteLine("Antwort: " # stdout);
! Beim stdout den ueberfluessigen Vorspann entfernen
integer laenge = stdout.Length();
integer pos = stdout.Find("body"); 
! ab hier kommen auswertbare Informationen
pos = pos + 10;
stdout = stdout.Substr(pos, (laenge - pos));
! wenn Rückmeldung mit allen Daten angezeigt werden soll, 
! Ausrufezeichen nächste Zeile entfernen
! WriteLine("Antwort ohne Vorspann: " # stdout);
string wort = "8326"; !Brennermodulation
integer laenge = wort.Length();
! WriteLine("laenge: " # laenge); zum Testen für andere Parameter 
! für Skripttest Ausrufezeichen entfernen
integer pos = stdout.Find(wort);
! WriteLine("pos:" #pos);
pos = pos + 39; !bei anderen Parametern meist zwischen 25 und 50
string daten = stdout.Substr((pos + laenge +1), 100);
! WriteLine("daten :"#daten);
integer pos = daten.Find(wort);
daten = daten.Substr(0, (pos));
integer zahl = daten.ToFloat();
! keine Prüfung, da auch 0 sein kann
dom.GetObject("H_Brennermodulation").State(zahl);
WriteLine("H_Brennermodulation: "#zahl);
! nur für Chart CUxD
dom.GetObject("CUxD.CUX2801001:1.LOGIT").State
("H_Brennermodulation"#";"#zahl);
WriteLine("Hallo Welt!");
! Skriptende:

Beispiel zum Setzen der Betriebsart auf Komfort-Betrieb mit ‚S700=3’ mittels CuxD:

! Skriptanfang:
! Heizung KOMFORT (=AN - keine Nachtabsenkung)
! Anweisung senden
string urlset ='http://192.168.178.88/S700=3'; !IP anpassen
WriteLine("Befehl: " # urlset);
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State
("wget -t 5 -T 20 -q -O - '"# urlset #"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
! Kontrollabfrage
string url='http://192.168.178.88/700'; !IP anpassen
! WriteLine("URL: " # url);
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State
("wget -t 5 -T 20 -q -O - '"# url #"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State();
! WriteLine("Antwort: " # stdout);
! Beim stdout den ueberfluessigen Vorspann entfernen
integer laenge = stdout.Length();
integer pos = stdout.Find("body");
pos = pos + 10;
stdout = stdout.Substr(pos, (laenge - pos));
! wenn Rückmeldung mit allen Daten angezeigt werden soll, 
! Ausrufezeichen nächste Zeile entfernen
! WriteLine("Antwort ohne Vorspann: " # stdout);
string wort = "700"; !Heizbetrieb
integer laenge = wort.Length();
! WriteLine("laenge: " # laenge);
integer pos = stdout.Find(wort);
! WriteLine("pos:" #pos);
pos = pos + 28;
! WriteLine("pos: " # pos);	
string daten = stdout.Substr((pos + laenge +1), 100);
! WriteLine("daten :"#daten);
string substring = daten.Substr(0, 1);
integer zahl = substring.ToInteger();
WriteLine("aktueller Heizbetrieb (0 bis 3): " # zahl);
if (zahl == 0) {dom.GetObject('H_Heizbetrieb').State("Heizung AUS");}
if (zahl == 1) {dom.GetObject('H_Heizbetrieb').State("Heizung Automatik");}
if (zahl == 2) {dom.GetObject('H_Heizbetrieb').State("Heizung Nachtabsenkung");}
if (zahl == 3) {dom.GetObject('H_Heizbetrieb').State("Heizung Komfort");}
! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Heizbetrieb"#";"#zahl);	
! alle Werte aktualisieren
var programObj = dom.GetObject("Heizungswerte abfragen"); 
! Programmnamen ggf. anpassen
programObj.ProgramExecute();
WriteLine("Hallo Welt!");
! Skriptende:

Heizung Abfrage und speichern als Systemvariable:
Ferienbetrieb von-bis / Absenkniveau (632/633/648)
Heiz- und Warmwasserbetrieb (700/1600/8700/8326/8743/8314/8830)
Übertrag der von einem One-Wire Sensor gemessenen Raumtemperatur zum BSB (I10000)
Protokollieren (für Auswertungen mit CUxD Highcharts)

!Heizung Abfrage V17 mit CUxD 2018-02-17

!wget mit ausführl. Syntax 2018-02-17
!inkl. Daten Ferienbetrieb und -niveau 2018-01-31

!Prüfung of Rückgabewerte ungleich Null
!auch senden an CUxD-Geräte Tempsens_H_*

!H_Trinkwassertemperatur korrigiert +1.3  2017-08-11
!mit Übertrag der Raumtemperatur an die Heizung Parameter 8740 2017-05-13
!mit OneWire Sensoren 2017-04-26

!als Systemvariablen sind in Homematic angelegt:
!H_Ferien_Beginn Zeichenkette
!H_Ferien_Ende Zeichenkette
!H_Ferienniveau Zeichenkette

!H_Aussentemperatur	Zahl
!H_Brennermodulation	Zahl
!H_Vorlauftemperatur	Zahl
!H_Kesselruecklauftemperatur	Zahl
!H_Trinkwassertemperatur	Zahl
!H_Heizbetrieb 	Zeichenkette
!H_Trinkwasserbetrieb	Zeichenkette

!632	Beginn Ferienbetrieb	TT.MM
!633	Ende Ferienbetrieb	TT.MM 
!648  Frostschutz / Reduziert

string url='http://192.168.10.13/632/633/648/700/1600/8700/8326/8743/8314/8830/T';

!WriteLine("URL: " # url);

!--timeout=seconds  ! während der Dauer der Abfrage werden von der CCU keine anderen Skripte ausgeführt 
! CUxD-Handbuch 5.8.2 System.Exec "Es ist zu beachten, dass die Verarbeitung des HM-Scripts erst fortgesetzt wird, nachdem das aufgerufene Programm beendet wurde. Während dieser Zeit werden keine anderen HM-Scripts ausgeführt!"

!dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# url #"'");  ! abgekürzte Wget Syntax
dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget --tries=5 --timeout=20 --quiet --output-document=- '"# url #"'");  ! ausführliche Wget Syntax
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
!WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	!WriteLine("Antwort ohne Vorspann: " # stdout);

string wort = "632"; !Ferien Heizkreis 1 Beginn TT.MM
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 48;
	!WriteLine("pos: " # pos);	
	string daten = stdout.Substr((pos + laenge +1), 13);
	daten = daten.Substr(2,5);
	!WriteLine("daten :"#daten);
	dom.GetObject('H_Ferien_Beginn').State("Ferien ab: ???"); ! setzt vorherigen Wert zurück
	dom.GetObject('H_Ferien_Beginn').State("Ferien ab: "# daten);
	var temp = dom.GetObject('H_Ferien_Beginn').Value();
	WriteLine("Ferien Heizkreis 1 Beginn TT.MM: " # temp);	
	
string wort = "633"; !Ferien Heizkreis 1 Ende TT.MM
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 48;
	!WriteLine("pos: " # pos);	
	string daten = stdout.Substr((pos + laenge +1), 15);
	daten = daten.Substr(0,5);
	!WriteLine("daten :"#daten);
	dom.GetObject('H_Ferien_Ende').State("Ferien bis: ???"); ! setzt vorherigen Wert zurück
	dom.GetObject('H_Ferien_Ende').State("Ferien bis: "# daten);
	var temp = dom.GetObject('H_Ferien_Ende').Value();
	WriteLine("Ferien Heizkreis 1 Ende TT.MM: " # temp);	
	
string wort = "648"; !Betriebsniveau Ferien
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 48;
	!WriteLine("pos: " # pos);	
	string daten = stdout.Substr((pos + laenge +1), 15);
	daten = daten.Substr(0,12);
	!WriteLine("daten :"#daten);
	dom.GetObject('H_Ferienniveau').State("Ferienniveau: ???"); ! setzt vorherigen Wert zurück
	dom.GetObject('H_Ferienniveau').State("Ferienniveau: "# daten);
	var temp = dom.GetObject('H_Ferienniveau').Value();
	WriteLine("Betriebsniveau Ferien: " # temp);
	
	
string wort = "700"; !Heizbetrieb
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 28;
	!WriteLine("pos: " # pos);	
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	string substring = daten.Substr(0, 1);
	integer zahl = substring.ToInteger();
	!WriteLine("zahl: " # zahl);
		if (zahl == 0) {dom.GetObject('H_Heizbetrieb').State("Heizung AUS");}
		if (zahl == 1) {dom.GetObject('H_Heizbetrieb').State("Heizung Automatik");}
		if (zahl == 2) {dom.GetObject('H_Heizbetrieb').State("Heizung Nachtabsenkung");}
		if (zahl == 3) {dom.GetObject('H_Heizbetrieb').State("Heizung Komfort");}
		
! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Heizbetrieb"#";"#zahl);


string wort = "1600"; !Trinkwasserbetrieb
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 35;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	string substring = daten.Substr(0, 1);
	integer zahl = substring.ToInteger();
	!WriteLine("zahl: " # zahl);
		if (zahl == 0) {dom.GetObject('H_Trinkwasserbetrieb').State("Warmwasserbetrieb - AUS");}
		if (zahl == 1) {dom.GetObject('H_Trinkwasserbetrieb').State("Warmwasserbetrieb - EIN");}

	! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Trinkwasserbetrieb"#";"#zahl);


string wort = "8700"; !Aussentemperatur
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 41;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	!Korrektur des angezeigten Wertes auf das Niveau der übrige Thermometer
	if (zahl<>0)
		{
		zahl = zahl - 3.5;
		dom.GetObject("H_Aussentemperatur").State(zahl);
		WriteLine("H_Aussentemperatur: "#zahl); 

		! nur für Chart CUxD 
		dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Aussentemperatur"#";"#zahl);

		! für CUxD Gerät Tempsens_H_Aussen
		dom.GetObject("CUxD.CUX9002012:1.SET_TEMPERATURE").State(zahl);	
		}
	
string wort = "8326"; !Brennermodulation
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 39;;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	!keine Prüfung, da auch 0 sein kann
	dom.GetObject("H_Brennermodulation").State(zahl);
	WriteLine("H_Brennermodulation: "#zahl); 

	! nur für Chart CUxD 
	dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Brennermodulation"#";"#zahl);

string wort = "8743"; !Vorlauftemperatur 1:
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 45;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	if (zahl<>0)
		{
		dom.GetObject("H_Vorlauftemperatur").State(zahl);
		WriteLine("H_Vorlauftemperatur: "#zahl); 

		! nur für Chart CUxD 
		dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Vorlauftemperatur"#";"#zahl);

		! für CUxD Gerät Tempsens_H_KesselVor
		dom.GetObject("CUxD.CUX9002014:1.SET_TEMPERATURE").State(zahl);	
		}
		
string wort = "8314"; !Kesselrücklauftemperatur
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 52;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	if (zahl<>0)
		{	
		dom.GetObject("H_Kesselruecklauftemperatur").State(zahl);
		WriteLine("H_Kesselruecklauftemperatur: "#zahl); 

		! nur für Chart CUxD 
		dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Kesselruecklauftemperatur"#";"#zahl);

		! für CUxD Gerät Tempsens_H_KesselRue
		dom.GetObject("CUxD.CUX9002013:1.SET_TEMPERATURE").State(zahl);	
		}
		
string wort = "8830"; !Trinkwassertemperatur
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 48;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	!Korrektur relativ zur Kesselvorlauftemperatur
	if (zahl<>0)
		{	
		zahl = zahl + 1.3;
		dom.GetObject("H_Trinkwassertemperatur").State(zahl);
		WriteLine("H_Trinkwassertemperatur "#zahl); 

		! nur für Chart CUxD 
		dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Trinkwassertemperatur"#";"#zahl);

		! für CUxD Gerät Tempsens_H_Trinkw
		dom.GetObject("CUxD.CUX9002015:1.SET_TEMPERATURE").State(zahl);	
		}

!Übertrag der Raumtemperatur Esszimmer  ...4d6 an die Heizung als Parameter 8740

	real temp = dom.GetObject("T_Innentemperatur_Esszimmer").Value();
	temp = temp.ToString();

	string urlset = 'http://192.168.10.13/I10000='# temp;
	!WriteLine("url " # urlset);

	dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# urlset #"'");   
	dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
	var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
	!WriteLine("stdout: " # stdout);
	
	!Abfrage, ob Setzen des Wertes ok  
	string url='http://192.168.10.13/8740';

	dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# url #"'");   
	dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
	var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
	!WriteLine("stdout: " # stdout);

	string wort = "8740"; !Raumtemperatur 1
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 42;
	string daten = stdout.Substr((pos + laenge +1), 5);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	!integer zahl = daten.ToFloat();
	WriteLine("an die Heizung übertragene Raumtemperatur (8740) "#daten #"°C"); 

WriteLine("Hallo Welt!");

Anweisungen zum Ändern des Betriebszustands der Heizung:
Damit syntax-sichere Anweisungen von CCU an BSB gegeben werden können (wichtig z.B. auch wenn via VPN kein direkter Zugang zum BSB-Adapter möglich ist).

Heizung AUS (= Frostschutzbetrieb):

!Heizung AUS (=Frostschutzbetrieb)  2017-03-09

string urlset ='http://192.168.10.13/S700=0';
WriteLine("Befehl: " # urlset);

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# urlset #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 

string url='http://192.168.10.13/700';

WriteLine("URL: " # url);

!--timeout=seconds

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# url #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	
!Werte aktualisieren
var programObj = dom.GetObject("Heizungswerte abfragen");
programObj.ProgramExecute();	
	
	WriteLine("Antwort ohne Vorspann: " # stdout);
WriteLine("Hallo Welt!");

Heizung Automatik (= AN - mit Nachtabsenkung):

!Heizung Automatik (=AN - mit Nachtabsenkung)  2017-03-09

!http://192.168.10.13/Passwort/S700=0 (Schutzbetrieb)
!http://192.168.10.13/Passwort/S700=1 (Automatik)
!http://192.168.10.13/Passwort/S700=2 (Reduziert)
!http://192.168.10.13/Passwort/S700=3 (Komfort)

string urlset ='http://192.168.10.13/S700=1';
WriteLine("Befehl: " # urlset);

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# urlset #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 

string url='http://192.168.10.13/700';

WriteLine("URL: " # url);

!--timeout=seconds

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# url #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	WriteLine("Antwort ohne Vorspann: " # stdout);

!Werte aktualisieren
var programObj = dom.GetObject("Heizungswerte abfragen");
programObj.ProgramExecute();	
	
WriteLine("Hallo Welt!");

Heizung KOMFORT (= AN - keine Nachtabsenkung):

!Heizung KOMFORT (=AN - keine Nachtabsenkung)  2017-03-09

!http://192.168.10.13/Passwort/S700=0 (Schutzbetrieb)
!http://192.168.10.13/Passwort/S700=1 (Automatik)
!http://192.168.10.13/Passwort/S700=2 (Reduziert)
!http://192.168.10.13/Passwort/S700=3 (Komfort)

! Anweisung senden
string urlset ='http://192.168.10.13/S700=3';
WriteLine("Befehl: " # urlset);

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# urlset #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 

! Kontrollabfrage
string url='http://192.168.10.13/700';

WriteLine("URL: " # url);

!--timeout=seconds

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# url #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	WriteLine("Antwort ohne Vorspann: " # stdout);
	
!alle Werte aktualisieren
var programObj = dom.GetObject("Heizungswerte abfragen");
programObj.ProgramExecute();	
	
WriteLine("Hallo Welt!");

Heizung NACHTABSENKUNG (dauernd, d.h. auch tagsüber!):

!Heizung Nachtabsenkung (dauernd, d.h. auch tagsüber Nachtabsenkung)  2017-03-09

!http://192.168.10.13/Passwort/S700=0 (Schutzbetrieb)
!http://192.168.10.13/Passwort/S700=1 (Automatik)
!http://192.168.10.13/Passwort/S700=2 (Reduziert)
!http://192.168.10.13/Passwort/S700=3 (Komfort)


string urlset ='http://192.168.10.13/S700=2';
WriteLine("Befehl: " # urlset);

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# urlset #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 

string url='http://192.168.10.13/700';

WriteLine("URL: " # url);

!--timeout=seconds

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -q -O - '"# url #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	WriteLine("Antwort ohne Vorspann: " # stdout);
	
!Werte aktualisieren
var programObj = dom.GetObject("Heizungswerte abfragen");
programObj.ProgramExecute();	
	
WriteLine("Hallo Welt!");

Abfrage der Tagesdurchschnitte /A bestimmter Parameter und speichern als Systemvariable:

!Heizung Abfrage Tagesdurchschnitte V5 2017-10-07

!Raumtemperatur Ist und Trinkwassertemperatur ergänzt
!Variablen reduziert

!als Systemvariablen sind in Homematic angelegt:
!H_Aussentemperatur_24h				Zahl	8700
!H_Brennermodulation_24h			Zahl	8326
!H_Vorlauftemperatur_24h			Zahl	8743
!H_Kesselruecklauftemperatur_24h	Zahl	8314

!H_Raumtemperatur_Ist_24h			Zahl	8740
!H_Raumtemperatur_Soll_24h  ???
!H_Trinkwassertemperatur_24h		Zahl	8830

string url='http://192.168.10.13/A';

WriteLine("URL: " # url);

!--timeout=seconds

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 -qO- '"# url #"'");   
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
!WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	WriteLine("Antwort ohne Vorspann: " # stdout);
	
!----------------------------------------------------------------------------

string wort = "8700"; !Aussentemperatur
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 20;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	!Korrektur des angezeigten Wertes auf das Niveau der übrige Thermometer
	zahl = zahl - 3.5;
	dom.GetObject("H_Aussentemperatur_24h").State(zahl);
	WriteLine("H_Aussentemperatur_24h: "#zahl); 

! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Aussentemperatur_24h"#";"#zahl);

!----------------------------------------------------------------------------

string wort = "8326"; !Brennermodulation
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 21;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	dom.GetObject("H_Brennermodulation_24h").State(zahl);
	WriteLine("H_Brennermodulation_24h: "#zahl); 

! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Brennermodulation_24h"#";"#zahl);

!----------------------------------------------------------------------------

string wort = "8743"; !Vorlauftemperatur 1:
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 23;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	!daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	dom.GetObject("H_Vorlauftemperatur_24h").State(zahl);
	WriteLine("H_Vorlauftemperatur_24h: "#zahl); 

! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Vorlauftemperatur_24h"#";"#zahl);

!----------------------------------------------------------------------------

string wort = "8314"; !Kesselrücklauftemperatur
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 33;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	dom.GetObject("H_Kesselruecklauftemperatur_24h").State(zahl);
	WriteLine("H_Kesselruecklauftemperatur_24h: "#zahl); 

! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Kesselruecklauftemperatur_24h"#";"#zahl);

!----------------------------------------------------------------------------

string wort = "8740"; !Raumtemperatur 1
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 21;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	dom.GetObject("H_Raumtemperatur_Ist_24h").State(zahl);
	WriteLine("H_Raumtemperatur_Ist_24h: "#zahl); 

! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Raumtemperatur_Ist_24h"#";"#zahl);

!----------------------------------------------------------------------------
string wort = "8830"; !Trinkwassertemperatur
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 28;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	dom.GetObject("H_Trinkwassertemperatur_24h").State(zahl);
	WriteLine("H_Trinkwassertemperatur_24h: "#zahl); 

! nur für Chart CUxD 
!dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("H_Trinkwassertemperatur_24h"#";"#zahl);


WriteLine("Hallo Welt!");

Abfrage der angeschlossenen OneWire-Sensoren und speichern als Systemvariable:

!Temperatursensoren Abfrage CUxD 2017-10-13 (Auszug)


!als Systemvariablen sind in Homematic angelegt:
!28ff99e890160456 T_Aussentemperatur_Nord
!28ffff85901604d6 T_Innentemperatur_Esszimmer	

string url='http://192.168.10.13/ipwe.cgi';

!WriteLine("URL: " # url);

!--timeout=seconds

dom.GetObject("CUxD.CUX2801001:1.CMD_SETS").State("wget -t 30 --timeout=20 -q -O - '"# url #"'");
dom.GetObject("CUxD.CUX2801001:1.CMD_QUERY_RET").State(1);          
var stdout = dom.GetObject("CUxD.CUX2801001:1.CMD_RETS").State(); 
!WriteLine("Antwort: " # stdout);

!Beim stdout den ueberfluessigen Vorspann entfernen
	integer laenge = stdout.Length();
	integer pos = stdout.Find("body");
	pos = pos + 10;
	stdout = stdout.Substr(pos, (laenge - pos));
	!wenn Rückmeldung mit allen Daten angezeigt werden soll, Ausrufezeichen nächste Zeile entfernen
	!WriteLine("Antwort ohne Vorspann: " # stdout);

string wort = "28ff99e890160456"; !T_Aussentemperatur_Nord
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 11;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	if (zahl<>0)
		{
		WriteLine("T_Aussentemperatur_Nord gemessen: "#zahl); 
		dom.GetObject("T_Aussentemperatur_Nord").State(zahl);
		! nur für Chart CUxD 
		dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("T_Aussentemperatur_Nord"#";"#zahl);	
		}
	
string wort = "28ffff85901604d6"; !T_Innentemperatur_Esszimmer
	integer laenge = wort.Length();
	!WriteLine("laenge: " # laenge);
	integer pos = stdout.Find(wort);
	!WriteLine("pos:" #pos);
	pos = pos + 11;
	string daten = stdout.Substr((pos + laenge +1), 100);
	!WriteLine("daten :"#daten);
	integer pos = daten.Find(wort);
	daten = daten.Substr(0, (pos));
	integer zahl = daten.ToFloat();
	if (zahl<>0)
		{
		dom.GetObject("T_Innentemperatur_Esszimmer").State(zahl);
		WriteLine("T_Innentemperatur_Esszimmer: "#zahl); 	
		! nur für Chart CUxD 
		dom.GetObject("CUxD.CUX2801001:1.LOGIT").State("T_Innentemperatur_Esszimmer"#";"#zahl);
		}	

WriteLine("Hallo Welt!");

8.4 ioBroker

BSB-LAN-User „hacki11“ hat einen Adapter für ioBroker entwickelt, den er freundlicherweise in seinem GitHub-Repo zur Verfügung stellt.
Vielen Dank!


Die folgenden ioBroker-Beispiele stammen vom FHEM-Forumsmitglied „Thomas_B”.
Vielen Dank!

Werte abrufen und anzeigen (exemplarisch ‚Warmwasser Solltemperatur’):

ioBroker1

Unter ‚ioBroker Admin → Adapter’ eine ‚Parser’-Instanz hinzufügen:

ioBroker2

Danach unter ‚ioBroker Admin → Instanzen’ die hinzugefügten Adapterinstanz ‚parser.0’ zum Konfigurieren öffnen:

ioBroker3

Dort auf das ‚+’ klicken, danach unter ‚Namen’ den Namen ‚TWW_Nennsollwert’ vergeben. Unter ‚URL oder Dateiname’ die IP des BSB-LAN-Adapters samt Parameternummer angeben. Anschließend auf das ‚Bearbeiten’-Icon klicken.

ioBroker4

Es öffnet sich die Eingabemaske, in der unter ‚RegEx’ folgende Zeichenfolge eingegeben werden muß:

asser\s+-\s+TWW Nennsollwert\:\s+(\d{2}.\d)

ioBroker5

Danach kann die Eingabemaske mit ‚Speichern’ geschlossen werden.

Das Abfrageintervall kann man nach Bedarf einstellen, danach auf ‚Speichern und Schließen’ klicken. Damit ist die Adapterkonfiguration abgeschlossen.

Unter ‚ioBroker Admin → Objekte’ findet sich nun der Ordner ‚parser.0’ und die unter der Instanz ‚parser.0’ angelegten Datennamen und deren Werte:

ioBroker6

Die Werte können unter VIS mittels eines ‚Basic-Number’-Widgets mit folgenden Einstellungen angezeigt werden:

ioBroker7

Widgetcode zum Importieren:

[{"tpl":"tplValueFloat","data":{"oid":"parser.0.TWW_Nennsollwert","visibility-cond":"==","visibility-val":1,"is_comma":"true","factor":"1","html_append_singular":" ºC","html_append_plural":" ºC","gestures-offsetX":0,"gestures-offsetY":0,"is_tdp":false,"signals-cond-0":"==","signals-val-0":true,"signals-icon-0":"/vis.0/bluefox_ehome/lowbattery.png","signals-icon-size-0":0,"signals-blink-0":false,"signals-horz-0":0,"signals-vert-0":0,"signals-hide-edit-0":false,"signals-cond-1":"==","signals-val-1":true,"signals-icon-1":"/vis.0/bluefox_ehome/lowbattery.png","signals-icon-size-1":0,"signals-blink-1":false,"signals-horz-1":0,"signals-vert-1":0,"signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis.0/bluefox_ehome/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"visibility-groups-action":"hide","lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"digits":"1"},"style":{"left":"398px","top":"428px","width":"59px","height":"18px","color":"white","text-align":"right","font-family":"Arial, Helvetica, sans-serif","font-style":"normal","font-variant":"normal","font-weight":"bold","font-size":"","z-index":"20"},"widgetSet":"basic"}]

Schalter anlegen (exemplarisch ‚Heizung Automatik (AN)’-Schalter):

ioBroker8

Zunächst ein leeres Script ‚Heizung Automatik Schalter’ anlegen:

ioBroker9

Dann ein Blocky-Script ‚Heizung Automatik script’ mit folgendem Inhalt anlegen (der nachfolgende Code kann in Blocky importiert werden):

ioBroker10

on({id: "javascript.0.scriptEnabled.Heizung_Automatik_Schalter", change: "ne"}, function (obj) {
  var value = obj.state.val;
  var oldValue = obj.oldState.val;
  for (var count = 0; count < 5; count++) {
    try {
      require("request")('http://<IP des BSB-LAN Adapters>/S700=1').on("error", function (e) {console.error(e);});
    } catch (e) { console.error(e); }
    console.log("request: " + 'http:// ://<IP des BSB-LAN Adapters>//S700=1');
  }
});

Dann ein ‚jqui – Button State’-Widget in VIS anlegen:

ioBroker11

In den Eigenschaften unter ‚Schalter’ das anfangs angelegte leere Script angeben:

ioBroker12

Damit lässt sich die Betriebsart ‚Heizung Automatik’ einschalten.

Damit der Schalterzustand durch Button green oder Button red entsprechend visualisiert wird, müssen noch folgende Signalbilder in dem Widget hinzugefügt werden, wobei die Bilder „on.png” und „off.png” in dem genannten Verzeichnispfad abgespeichert werden müssen.

ioBroker13

ioBroker14

Widgetcode zum Importieren:

[{"tpl":"tplJquiButtonState","data":{"oid":"javascript.0.scriptEnabled.Heizung_Automatik_Schalter(2)","g_fixed":false,"g_visibility":false,"g_css_font_text":true,"g_css_background":true,"g_css_shadow_padding":false,"g_css_border":false,"g_gestures":false,"g_signals":true,"g_last_change":false,"visibility-cond":"==","visibility-val":1,"visibility-groups-action":"hide","buttontext":"Heizung Automatik (AN)","signals-cond-0":"==","signals-val-0":"Betriebsart: 1 - Automatik","signals-icon-0":"/vis.0/main/img/on.png","signals-icon-size-0":"33","signals-blink-0":false,"signals-horz-0":"-1","signals-vert-0":"6","signals-hide-edit-0":false,"signals-cond-1":"!=","signals-val-1":"Betriebsart: 1 – Automatik","signals-icon-1":"/vis.0/main/img/off.png","signals-icon-size-1":"20","signals-blink-1":false,"signals-horz-1":"2","signals-vert-1":"17","signals-hide-edit-1":false,"signals-cond-2":"==","signals-val-2":true,"signals-icon-2":"/vis/signals/lowbattery.png","signals-icon-size-2":0,"signals-blink-2":false,"signals-horz-2":0,"signals-vert-2":0,"signals-hide-edit-2":false,"lc-type":"last-change","lc-is-interval":true,"lc-is-moment":false,"lc-format":"","lc-position-vert":"top","lc-position-horz":"right","lc-offset-vert":0,"lc-offset-horz":0,"lc-font-size":"12px","lc-font-family":"","lc-font-style":"","lc-bkg-color":"","lc-color":"","lc-border-width":"0","lc-border-style":"","lc-border-color":"","lc-border-radius":10,"lc-zindex":0,"value":"","signals-oid-1":"parser.0.Betriebsart","signals-oid-0":"parser.0.Betriebsart"},"style":{"left":"14px","top":"426px","width":"219px","height":"27px","z-index":"1","font-size":"x-small"},"widgetSet":"jqui"}]

Die Einbindung der jeweiligen Werte bei ‚Objekt ID [0]’ und ‚Objekt ID [1]’ (‚parser.0.Betriebsart’) wird nachfolgend erklärt.

Abfrage für die Betriebsart (für die On/Off-Visualisierung des Heizungsschalters):

Bei der Adapterkonfiguration für ‚parser.0’ eine Regel mit der Bezeichung ‚Betriebsart’ erstellen, dann die IP (samt Parameternummer) des BSB-LAN-Adapters angeben und zum Bearbeiten öffnen.

ioBroker15

Unter ‚RegEx’ folgende Syntax angeben:

(\w+:\s+\d\s+-\s+\w+)

ioBroker16


8.5 Loxone

Die Loxone-Beispiele stammen vom FHEM-Forumsmitglied „Loxonaut”.
Vielen Dank!

Abfrage von Parametern:
Die Abfrage von Parametern erfolgt in Loxone mittels virtuellen HTTP Eingängen und der JSON-Funktion von BSB-LAN (URL-Befehl /JQ=). Eine detailliertere Beschreibung der virtuellen HTTP Eingänge und der Befehle ist in den Dokumentationen zu Loxone und im Loxone-Wiki zu finden.

Achtung: Die Entwicklung der JSON-Funktion in BSB-LAN ist noch nicht endgültig abgeschlossen, es kann jederzeit zu Änderungen kommen. Die Konfiguration ist dann entsprechend anzupassen.

Das folgende Beispiel zeigt die Einrichtung anhand des Parameters “8700 Außentemperatur”.

Zum Hinzufügen eines virtuellen HTTP Eingangs muss zunächst im Fenster “Peripherie” die Zeile “Virtuelle Eingänge” markiert werden. Nun klickt man auf die oben erschienene Schaltfläche “Virtueller HTTP Eingang”:

HTTP Eingang

Bei den Eigenschaften trägt man die Bezeichnung und die entsprechenden Werte ein (beim Abfragezyklus sollte ein entsprechend sinnvoller Wert gewählt werden), die URL des BSB-LAN-Adapters ist hierbei um den Befehl
/JQ=8700
für die Abfrage der Außentemperatur zu erweitern:

vHTTP Eingang

Anschließend fügt man dem vituellen HTTP Eingang noch einen virtuellen HTTP Eingang Befehl hinzu:

HTTP Befehl

Hier definiert man, was aus dem JSON-Export ausgelesen werden soll. Der JSON-Export ist wie folgt aufgebaut:

{
"8700": {
"name": "Aussentemperatur","value": "16.6",
"unit": "&deg;C",
"desc": "",
"dataType": 0
}
}

Mittels Loxone-Befehlserkennung
value": "\v
wird der Wert bei “value” des JSON-Exports ausgelesen:

vHTTP Befehl

Unter “Visualisierung” bei den Eigenschaften sollte bei “Kategorie” und “Raum” jeweils eine Bezeichnung eingetragen werden, damit die spätere Darstellung in der Loxone-App entsprechend funktioniert (hier: Außenbereich, Wetter). Die nun ausgelesenen Werte des Außentemperaturfühlers können dann in der Loxone-App angezeigt und die Statistik per Graph visualisiert werden.

Screenshot Räume

Screenshot Log AT

Hinweis:
Das Setzen von Parametern/Werten könnte analog zu obigem Beispiel mit der Funktion “virtueller Ausgang” und dem URL-Befehl /JS (JSON) oder via regulärem URL-Befehl /S<x>=<y> möglich sein (s. entspr. Kapitel), wurde allerdings noch nicht gestestet.


8.6 IP-Symcon

Die BSB-LAN-User „sokkederheld” und „Joachim” haben ihre IPS-Skripte samt Screenshots im Symcon-Forum vorgestellt: Hier und hier. Auf eine weitere/erneute Beschreibung wird daher an dieser Stelle verzichtet.
Vielen Dank!


8.7 MQTT, InfluxDB, Telegraf und Grafana

Ein vom FHEM-Forumsmitglied „cubase” sehr gut dokumentiertes Beispiel für die Verwendung von MQTT, InfluxDB, Telegraf und Grafana findet sich hier. Auf eine weitere/erneute Beschreibung wird daher an dieser Stelle verzichtet.
Vielen Dank!


BSB-LAN-User Ronald hat hierzu ebenfalls ein sehr ausführliches und gut dokumentiertes Beispiel erstellt. Es ist hier zu finden.
Vielen Dank!


8.8 MQTT und FHEM

Das folgende Beispiel stammt vom FHEM-Forumsmitglied „mifh”, der originale FHEM-Forumsbeitrag ist hier zu finden.
Vielen Dank!

Das folgende Beispiel nutzt den FHEM-eigenen MQTT-Server und ist für eine Gastherme samt Heizleistungsberechnung konzipiert. Letzteres ist bei Ölbrennern und Wärmepumpen hinfällig.
Bitte beachte die Anmerkungen im originalen FHEM-Forumsbeitrag (s.o.).

Auf die notwendigen Anpassungen in der Datei BSB_lan_config.h wird an dieser Stelle nicht weiter eingegangen, bitte beachte dazu die entspr. Punkte in Kap. 5!

Parametrierung MQTT-Server in FHEM:

define MQTT_TST MQTT2_SERVER 1883 global  
define MQTT_2 MQTT <IP-Adresse>:1883  

Heizung als MQTT-Device in FHEM darstellen:

define Hzg_Therme MQTT_DEVICE
attr Hzg_Therme IODev MQTT_2
attr Hzg_Therme alias Brötje Heizung
attr Hzg_Therme group Heizung
attr Hzg_Therme room Heizung
attr Hzg_Therme subscribeReading_Kesseltemperatur Zuhause/Heizungsraum/BSB-LAN/8310
attr Hzg_Therme subscribeReading_Ruecklauftemperatur Zuhause/Heizungsraum/BSB-LAN/8314
attr Hzg_Therme subscribeReading_Geblaesedrehzahl Zuhause/Heizungsraum/BSB-LAN/8323
attr Hzg_Therme subscribeReading_Brennermodulation Zuhause/Heizungsraum/BSB-LAN/8326
attr Hzg_Therme subscribeReading_BetriebsstundenStufe1 Zuhause/Heizungsraum/BSB-LAN/8330
attr Hzg_Therme subscribeReading_StartzaehlerBrenner Zuhause/Heizungsraum/BSB-LAN/8331
attr Hzg_Therme subscribeReading_BetriebsstundenHeizbetrieb Zuhause/Heizungsraum/BSB-LAN/8338
attr Hzg_Therme subscribeReading_BetriebsstundenTWW Zuhause/Heizungsraum/BSB-LAN/8339
attr Hzg_Therme subscribeReading_Gesamt_Gasenergie_Heizen Zuhause/Heizungsraum/BSB-LAN/8378
attr Hzg_Therme subscribeReading_Gesamt_Gasenergie_TWW Zuhause/Heizungsraum/BSB-LAN/8379
  
attr Hzg_Therme subscribeReading_Aussentemperatur Zuhause/Heizungsraum/BSB-LAN/8700
attr Hzg_Therme subscribeReading_DrehzahlHeizkreispumpe Zuhause/Heizungsraum/BSB-LAN/8735
  
attr Hzg_Therme stateFormat {sprintf("Leistung: %.1f kW",ReadingsVal($name,"Leistung",0))}
attr Hzg_Therme verbose 3 Hzg_Therme
  
define Hzg_Therme_NF1 notify Hzg_Therme:Geblaesedrehzahl.* {setHzgLeistung()}  

Das Notify setzt mit einer Perl-Funktion in 99_myUtils.pm das Reading Leistung:

sub setHzgLeistung{
	my $drehzahl=ReadingsVal("Hzg_Therme", "Geblaesedrehzahl",0);
	my $leistung;
	if ($drehzahl > 0) {
		$leistung = ($drehzahl- 1039.1)/383.1; # Heizungspezifische Parameter
		}
	else {
		$leistung = 0;
		}
	fhem("setreading Hzg_Therme Leistung $leistung");
}  

8.9 MQTT2 und FHEM

Das folgende Beispiel stammt vom FHEM-Forumsmitglied „FunkOdyssey”, der originale FHEM-Forumsbeitrag ist hier zu finden.
Vielen Dank!

Das folgende Beispiel nutzt den FHEM-eigenen MQTT2-Server, die Readings erscheinen nach der korrekten Einrichtung automatisch.

Auf die notwendigen Anpassungen in der Datei BSB_lan_config.h wird an dieser Stelle nicht weiter eingegangen, bitte beachte dazu die entspr. Punkte in Kap. 5!

Einrichten des MQTT2-Server in FHEM gemäß CommandRef:

defmod mqtt2Server MQTT2_SERVER 1883 global
attr mqtt2Server autocreate 1  

Sobald man in der Datei BSB_LANn_config.h die IP des FHEM-Servers angegeben hat, erscheint das MQTT2-Device mitsamt aller Readings:

defmod MQTT2_BSB_LAN MQTT2_DEVICE BSB_LAN
attr MQTT2_BSB_LAN IODev mqtt2Server
attr MQTT2_BSB_LAN readingList BSB_LAN:BSB/8314:.* Kesselruecklauftemperatur\
BSB_LAN:BSB/8700:.* Aussentemperatur\
BSB_LAN:BSB/8323:.* Geblaesedrehzahl\
BSB_LAN:BSB/8324:.* Brennergeblaesesollwert\
BSB_LAN:BSB/700:.* Betriebsart\
...

Das folgende Beispiel stammt vom FHEM-Forumsmitglied „Luposoft”, der originale FHEM-Forumsbeitrag ist hier zu finden.
Vielen Dank!

define mqtt2Server MQTT2_SERVER 1883 global
define MQTT2_BSB_LAN MQTT2_DEVICE BSB_LAN
define FileLog_MQTT2 FileLog ./log/%V-%G-MQTT2.log MQTT2_BSB_LAN

Diese publish-Ausgabe sendet ungerichtet das MQTT-Telegramm in die Welt, ohne zu wissen, ob jemand zuhört (ein Grundprinzip von MQTT).

set mqtt2Server publish BSB-LAN S5890=0 → Ausgabe des Steuerbefehls (manche brauchen auch ein I statt dem S) und unser Arduino hört genau auf BSB-LAN (zumindest in der Standardconfig).

Die dazugehörigen Einträge in FileLog_MQTT2:
2021-02-03_16:56:28 MQTT2_BSB_LAN MQTT: ACK_S5890=0 → Hier bestätigt BSB-LAN den Empfang.
2021-02-03_16:56:29 MQTT2_BSB_LAN BSB-LAN_5890: 0 - Kein → Das ist die Ausgabe nach der Abfrage der Heizung.

set mqtt2Server publish BSB-LAN 5890 → Einfache Wertabfrage.
2021-02-04_13:24:15 MQTT2_BSB_LAN MQTT: ACK_5890 → Hier bestätigt BSB-LAN den Empfang.
2021-02-04_13:24:16 MQTT2_BSB_LAN BSB-LAN_5890: 1 - Zirkulationspumpe Q4 → Das ist die Ausgabe nach der Abfrage der Heizung.


8.10 EDOMI

Das folgende Beispiel stammt vom BSB-LAN-User Lutz.
Vielen Dank!

Die Abfrage von Werten aus BSB-LAN erfolgt mittels des erstellten Logikbausteins 19001820.

Der Baustein greift über die JSON Schnittstelle von BSB LAN auf das Gateway zu und liefert je nach angegebenem Parameter die entsprechenden Werte.

Dabei sind folgende Eingangswerte einzutragen:
E1 = Trigger, nicht gleich Null
E2 = IP Adresse BSB-LAN Gateway
E3 = Parameter, z.B. Wert 8700 für Außentemperatur
E4 = Log Level

Als Ergebnis erhält EDOMI folgende Werte zurück:
A1 = Name des Parameters, z.B. “Aussentemperatur”
A2 = Wert des Parameters, z.B. “10,5”
A3 = Einheit des Parameters z.B. “°C”
A4 = Beschreibung von A2, wenn als Code ausgegeben.
A5 = Verkettung von A1 bis A4

EDOMI

Die Werte A1 bis A5 können dann über andere Bausteine weiterverarbeitet werden. In diesem Beispiel wird die Außentemperatur in ein internes Kommunikationsobjekt geschrieben, um den Inhalt z.B. in der Visu auszugeben oder die Werte für die Betriebszeit in ein Datenarchiv gespeichert, um daraus später Laufzeiten der Heizung zu ermitteln.


8.11 Home Assistant

ACHTUNG
Home Assistant ab der Version 2024.2.0 unterstützt keine selbst konfigurierten (MQTT) Entities die den Device Namen im Namen verwenden!
HA Fehlermeldung

BSB-LAN-User herr.vorragend hat eine ausführliche Beschreibung für die Einbindung in HomeAssistant via MQTT erstellt.
Vielen Dank dafür!

Die folgende Beschreibung zeigt auf, wie BSB-LAN via MQTT und ohne zusätzliche Automatisierungs-Workarounds in Home Assistant eingebunden werden kann. Diese Verfahren benötigen keine REST-API und schreibt Konfigurationsänderungen unmittelbar mit den verfügbaren Bordmitteln in den Heizungsregler.

Es is ratsam, an dieser Stelle mit Packages zu arbeiten. Somit können sämtliche Konfigurationen aller Domänen in einer YAML-Datei verwaltet und bearbeitet werden.

Es lassen sich wie folgt viele verschiedene Einzelwerte in einer Climate-Entität zusammenfassen.
Man erkennt somit auf Anhieb die aktuelle Betriebsart, die aktuelle Soll- wie auch Ist-Temperatur. Zudem lassen sich die Werte auch direkt über die grafische Oberfläche in die Therme zurückschreiben.

mqtt:
  climate:
    - name: "BSB-LAN Heizungstherme"
      unique_id: bsb_lan_climate_heizungstherme
      availability_topic: "BSB/status"
      payload_on: 1
      payload_off: 0
      modes:
        - auto
        - heat
        - cool
        - "off"
      mode_state_topic: "BSB/700"
      mode_state_template: >-
        {% set values = { '0 - Schutzbetrieb':'off', '1 - Automatik':'auto', '2 - Reduziert':'cool', '3 - Komfort':'heat'} %}
        {{ values[value] if value in values.keys() else 'off' }}
      mode_command_topic: "BSB"
      mode_command_template: >-
        {% set values = { 'off':'S700=0', 'auto':'S700=1', 'cool':'S700=2', 'heat':'S700=3'} %}
        {{ values[value] if value in values.keys() else '0' }}
      current_temperature_topic: "BSB/8740"
      current_temperature_template: >-
        {% if value == '---' %}
            {{ 'None' }}
        {% else %}
            {{ value }}
        {% endif %}
      min_temp: 17
      max_temp: 24
      temp_step: 0.1
      temperature_state_topic: "BSB/710"
      temperature_command_topic: "BSB"
      temperature_command_template: "{{'S710='+ (value| string)}}"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Für den manuellen Trinkwasserpush gibt es mehrere Möglichkeiten. Entweder über die Switch-Domain oder auch nur ein Button, der den TWW-Push auslöst. Da es von der Therme keine Rückmeldung gibt, dürfte der Button vermutlich die bessere Lösung sein. Der Schalter wird nie wissen, in welchem Status sich der Trinkwasserpush aktuell befindet.

  switch:
    - name: "BSB-LAN Manueller TWW-Push"
      unique_id: bsb_lan_switch_manueller_tww_push
      state_topic: "BSB/10019"
      command_topic: "BSB"
      payload_on: "S10019=1"
      payload_off: "S10019=0"
      state_on: "1 - Ein"
      state_off: "0 - Aus"
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

  button:
    - name: BSB-LAN Trinkwasserpush #war in v2.x noch 1603
      unique_id: bsb_lan_button_trinkwasserpush
      command_topic: "BSB"
      payload_press: "S10019=1"
      qos: 0
      retain: false
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Möchte man nicht nur die Climate-Entität nutzen, sondern auch Select-Entitäten für die Betriebsart, so geht das wie folgt:

  select:
    - name: BSB-LAN Betriebsart # Heizkreis 1
      unique_id: bsb_lan_select_betriebsart
      state_topic: "BSB/700"
      command_topic: "BSB"
      value_template: >
        {% set mapping = {0: 'Schutzbetrieb', 1: 'Automatik', 2: 'Reduziert', 3: 'Komfort'} %}
        {% set idx = value.split() | first | int %}
        {{ mapping[idx] }}
      command_template: >
        {% set mapping = {'Schutzbetrieb': 0, 'Automatik': 1, 'Reduziert': 2, 'Komfort': 3} %}
        S700={{ mapping[value] }}
      options:
        - Schutzbetrieb
        - Automatik
        - Reduziert
        - Komfort
      icon: mdi:list-box
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Zustände lassen sich sehr gut über binäre Sensoren anzeigen:

  binary_sensor:
    - name: BSB-LAN Kesselpumpe Q1
      state_topic: "BSB/8304"
      payload_on: "255 - Ein"
      payload_off: "---"
      unique_id: bsb_lan_kesselpumpe_q1
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Zustand Trinkwasserpumpe
      state_topic: "BSB/8820"
      payload_on: "255 - Ein"
      payload_off: "0 - Aus"
      unique_id: bsb_lan_zustand_trinkwasserpumpe
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Die Number-Domains ist ausgesprochen hilfreich, wenn man numerische Werte über MQTT direkt in the Therme zurückschreiben möchte:

  number:
    - name: BSB-LAN Heizkreis Komfortsollwert # Heizkreis 1 - Komfortsollwert
      unique_id: bsb_lan_heizkreis_komfortsollwert
      state_topic: "BSB/710"
      command_topic: "BSB"
      command_template: "S710={{ value }}"
      mode: slider
      min: 12
      max: 26
      step: 0.1
      unit_of_measurement: °C
      device_class: temperature
      icon: mdi:temperature-celsius
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Heizkreis Reduziertsollwert # Heizkreis 1 - Raumtemperatur-Reduziertsollwert
      unique_id: bsb_lan_heizkreis_reduziertsollwert
      state_topic: "BSB/712"
      command_topic: "BSB"
      command_template: "S712={{ value }}"
      mode: slider
      min: 12
      max: 26
      step: 0.1
      unit_of_measurement: °C
      device_class: temperature
      icon: mdi:temperature-celsius
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN TWW Nennsollwert # Trinkwassertemperatur-Nennsollwert
      unique_id: bsb_lan_tww_nennsollwert
      state_topic: "BSB/1610"
      command_topic: "BSB"
      command_template: "S1610={{ value }}"
      mode: slider
      min: 40
      max: 65
      step: 0.5
      unit_of_measurement: °C
      device_class: temperature
      icon: mdi:temperature-celsius
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN TWW Reduziertsollwert # Trinkwassertemperatur-Reduziertsollwert
      unique_id: bsb_lan_tww_reduziertsollwert
      state_topic: "BSB/1612"
      command_topic: "BSB"
      command_template: "S1612={{ value }}"
      mode: slider
      min: 40
      max: 65
      step: 0.5
      unit_of_measurement: °C
      device_class: temperature
      icon: mdi:temperature-celsius
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN TWW Nennsollwertmaximum # Trinkwassertemperatur-Nennsollwertmaximum
      unique_id: bsb_lan_tww_nennsollwertmaximum
      state_topic: "BSB/1614"
      command_topic: "BSB"
      command_template: "S1614={{ value }}"
      mode: slider
      min: 40
      max: 65
      step: 0.5
      unit_of_measurement: °C
      device_class: temperature
      icon: mdi:temperature-celsius
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Heizkennlinien-Steilheit
      unique_id: bsb_lan_heizkennlinien_steilheit
      state_topic: "BSB/720"
      command_topic: "BSB"
      command_template: "S720={{ value }}"
      mode: slider
      min: 0.1
      max: 2.0
      step: 0.01
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Heizkennlinien-Parallelverschiebung
      unique_id: bsb_lan_heizkennlinien-parallelverschiebung
      state_topic: "BSB/721"
      command_topic: "BSB"
      command_template: "S721={{ value }}"
      mode: slider
      min: 0
      max: 2
      step: 0.1
      unit_of_measurement: °C
      device_class: temperature
      availability_topic: "BSB/status"
      entity_category: "config"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Hinzufügen der üblichen Sensoren:

  sensor:
    - name: "BSB-LAN Aussentemperatur"
      state_topic: "BSB/8700"
      unique_id: bsb_lan_aussentemperatur
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: "BSB-LAN Aussentemperatur gedaempft"
      state_topic: "BSB/8703"
      unique_id: bsb_lan_aussentemperatur_gedaempft
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: "BSB-LAN Außentemperatur gemischt"
      state_topic: "BSB/8704"
      unique_id: bsb_lan_aussentemperatur_gemischt
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Kesseltemperatur-Istwert
      state_topic: "BSB/8310"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_kesseltemperatur_istwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Kesseltemperatur-Sollwert
      state_topic: "BSB/8311"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_kesseltemperatur_sollwert
      unit_of_measurement: °C
      device_class: temperature
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Kesselschaltpunkt
      state_topic: "BSB/8312"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_kesselschaltpunkt
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Ruecklauftemperatur-Istwert # Kesselrücklauftemperatur
      state_topic: "BSB/8314"
      unique_id: bsb_lan_ruecklauftemperatur_istwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Trinkwassertemperatur-Istwert Oben #B3
      state_topic: "BSB/8830"
      unique_id: bsb_lan_trinkwassertemperatur_istwert_oben
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Trinkwassertemperatur-Sollwert
      state_topic: "BSB/8831"
      unique_id: bsb_lan_trinkwassertemperatur_sollwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Geblaesedrehzahl
      state_topic: "BSB/8323"
      unique_id: bsb_lan_geblaesedrehzahl
      state_class: measurement
      unit_of_measurement: "rpm"
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Brennergeblaesesollwert
      state_topic: "BSB/8324"
      unit_of_measurement: "rpm"
      unique_id: bsb_lan_brennergeblaesesollwert
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Aktuelle Geblaeseansteuerung
      state_topic: "BSB/8325"
      unique_id: bsb_lan_aktuelle_geblaeseansteuerung
      unit_of_measurement: "%"
      icon: "mdi:fire"
      state_class: measurement
      device_class: power_factor
      availability_topic: "BSB/status"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Brennermodulation
      state_topic: "BSB/8326"
      unique_id: bsb_lan_brennermodulation
      unit_of_measurement: "%"
      icon: "mdi:fire"
      state_class: measurement
      device_class: power_factor
      availability_topic: "BSB/status"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Raumtemperatur-Istwert
      state_topic: "BSB/8740"
      value_template: >-
        {% if value == '---' %}
            {{ 'None' }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_raumtemperatur_istwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Raumtemperatur-Sollwert
      state_topic: "BSB/8741"
      value_template: >-
        {% if value == '---' %}
            {{ 'None' }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_raumtemperatur_solltwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Raumtemperatur Modell
      state_topic: "BSB/8742"
      value_template: >-
        {% if value == '---' %}
            {{ 'None' }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_raumtemperatur_modell
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Vorlauftemperatur-Sollwert
      state_topic: "BSB/8744"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_vorlauftemperatur_sollwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Schienenvorlauftemperatur-Istwert
      state_topic: "BSB/8950"
      unique_id: bsb_lan_schienenvorlauftemperatur_istwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Schienenvorlauftemperatur-Sollwert
      state_topic: "BSB/8951"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_schienenvorlauftemperatur_sollwert
      unit_of_measurement: °C
      device_class: temperature
      state_class: measurement
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Status Heizkreis
      state_topic: "BSB/8000"
      value_template: "{{value | regex_findall_index('-[ \t]+(.*)')}}"
      unique_id: bsb_lan_status_heizkreis
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Status Trinkwasserbetrieb
      state_topic: "BSB/8003"
      value_template: "{{value | regex_findall_index('-[ \t]+(.*)')}}"
      unique_id: bsb_lan_status_trinkwasserbetrieb
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Status Kessel
      state_topic: "BSB/8005"
      value_template: "{{value | regex_findall_index('-[ \t]+(.*)')}}"
      unique_id: bsb_lan_status_kessel
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Status Brenner
      state_topic: "BSB/8009"
      value_template: "{{value | regex_findall_index('-[ \t]+(.*)')}}"
      unique_id: bsb_lan_status_brenner
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Drehzahl Kesselpumpe
      state_topic: "BSB/8308"
      value_template: >-
        {% if value == '---' %}
            {{ '0.0' | float }}
        {% else %}
            {{ value }}
        {% endif %}
      unique_id: bsb_lan_drehzahl_kesselpumpe
      state_class: measurement
      unit_of_measurement: "%"
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    # ================================
    # FEHLERHISTORIE 1
    # ================================

    - name: BSB-LAN Historie01 DatumZeit
      state_topic: "BSB/6800"
      unique_id: bsb_lan_historie01_datumzeit
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Historie01 Fehlercode
      state_topic: "BSB/6803"
      unique_id: bsb_lan_historie01_fehlercode
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Historie01 SW Diagnosecode
      state_topic: "BSB/6805"
      unique_id: bsb_lan_historie01_sw_diagnosecode
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Historie01 FA Phase
      state_topic: "BSB/6806"
      unique_id: bsb_lan_historie01_faphase
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }


    - name: BSB-LAN SW Diagnosecode
      state_topic: "BSB/6705"
      unique_id: bsb_lan_sw_diagnosecode
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

    - name: BSB-LAN Brennerstarts Stufe 1 # Startzähler 1.Stufe
      unique_id: bsb_lan_brennerstarts_stufe1
      state_topic: "BSB/8331"
      availability_topic: "BSB/status"
      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Neben den obigen MQTT-Sensoren könnte man noch die Spreizung über einen Template-Sensor berechnen:

template:
  - sensor:
      - name: bsb_lan_temperaturspreizung
        unique_id: bsb_lan_temperaturspreizung
        state: "{{ (states('sensor.bsb_lan_kesseltemperatur_istwert') | float(0) - states('sensor.bsb_lan_ruecklauftemperatur_istwert') | float(0) ) | round(1) }}"
        unit_of_measurement: °C
        device_class: temperature

Hinweis am Rande:
Bei allen Konfigurationen wurde hier folgende Zeilen ergänzt. Das sieht ungewöhnlich aus und verursacht nur viele redunanten Code-Zeilen. Es hat aber den Vorteil, dass sämtliche Entitäten in Home Assistant zu einem Device zusammengeführt werden.

      device:
        {
          identifiers: ["00000002"],
          name: "Heizung",
          model: "Arduino Due",
          manufacturer: "Github",
        }

Man kann es also löschen, aber dann gibt es nur viele Einzelentitäten.
Die folgenden Screenshots zeigen die Darstellung in HomeAssistant.

Screenshot1
Screenshot2Climate
Screenshot3Tiles
Screenshot4Logbook-Card
Screenshot5Historie
Screenshot6Konfiguration
Screenshot7Temperaturen
Screenshot8TWW


BSB-LAN-User Yann hat eine ausführliche Beschreibung für die Einbindung in HomeAssistant in Verbindung mit Mosquitto erstellt (Englisch), sie ist hier zu finden.
Dies Beschreibung ist ebenfalls in Französisch verfügbar.
Vielen Dank!


BSB-LAN-User tiger42 hat im HomeAssistant-Forum eine Einbindungsmöglichkeit mittels JSON und MQTT beschrieben. Darüber hinaus hat er ein Einbindungsbeispiel für dieses Handbuch geschrieben, das im Folgenden dargestellt wird. Vielen Dank!

Die folgenden Beispiele sollen zeigen wie es möglich ist, BSB-LAN individuell in Home Assistant einzubinden, indem man Sensor- und Schalter-Entitäten selber definiert. Wie immer wenn es um Home Assistant geht, gilt auch hier: Viele Wege führen zum Ziel, es gibt nicht die “eine” beste Lösung. Deshalb sind alle Beispiele als Anregung zum selber Weiterentwickeln zu sehen.

Ein umfangreiches BSB-LAN Dashboard in Home Assistant könnte z.B. so aussehen:

HA dashboard

Aller folgender Code muss in die YAML-Datei configuration.yaml eingefügt werden, wenn nicht anders angegeben. Hat man seine Konfiguration aufgesplittet und z.B. die Sensordefinitionen in eine Datei sensors.yaml ausgelagert, sind die Anpassungen natürlich entsprechend dort vorzunehmen.

MQTT-Sensor

Das Auslesen von Daten per MQTT empfiehlt sich für alle Werte, die sich laufend ändern, wie z.B. Temperaturwerte. Voraussetzung dafür ist natürlich, dass man einen MQTT Broker einsetzt und die auszulesenden Werte auch per MQTT gepublisht werden.

Beispiel für einen Sensor, der die Vorlauftemperatur des HK ausliest:

mqtt:
  sensor:
    - state_topic: "bsb-lan/8310"
      name: BSB-LAN Vorlauftemperatur
      unit_of_measurement: °C
      device_class: temperature

Dieser Sensor wird in Home Assistant unter dem Namen sensor.bsb_lan_vorlauftemperatur erscheinen.

REST-Sensor & JSON

Wenn man MQTT nicht nutzen will oder kann, lassen sich Werte auch mittels REST-Sensor und JSON auslesen.

Die folgende Sensordefinition erzeugt einen Sensor zum Auslesen verschiedener Heizungsparameter, welche sich selten oder fast nie ändern (Betriebsart, Komfortsollwert etc.) und als Block abgefragt werden. Der Zustand (Wert) des Sensors enthält in diesem Beispiel den “SW Diagnosecode”, alle weiteren Werte werden als Attribute des Sensors gesetzt. Der Sensor macht alle 60 Sekunden einen Request gegen BSB-LAN.

sensor:
  - platform: rest
    name: BSB-LAN Status
    resource: "http://<BSB-LAN-IP>/JQ=700,1600,8000,8003,6705,710,712,720,721,1610,1612,5400"
    method: POST
    username: !secret bsb_lan_user
    password: !secret bsb_lan_pass
    scan_interval: 60
    value_template: "{{ value_json['6705'].value }}"
    json_attributes:
      - "700"
      - "1600"
      - "6705"
      - "8000"
      - "8003"
      - "710"
      - "712"
      - "720"
      - "721"
      - "1610"
      - "1612"
      - "5400"

Der Sensor taucht in Home Assistant unter dem Namen sensor.bsb_lan_status auf.

Um die Attribute dieses Sensors wiederum als separate Sensoren verfügbar zu machen, die sich komfortabel in die Oberfläche integrieren lassen, sind weitere Definitionen notwendig. Im folgenden Beispiel anhand der Parameter 700 (Betriebsart) und 1610 (TWW Nennsollwert) gezeigt:

sensor:
  - platform: template
    sensors:
      bsb_lan_betriebsart:
        unique_id: bsb_lan_betriebsart
        friendly_name: BSB-LAN Betriebsart
        value_template: "{% if states('sensor.bsb_lan_status') is defined and states('sensor.bsb_lan_status') != 'unavailable' %}{{ state_attr('sensor.bsb_lan_status', '700')['value'] }}{% else %}{{ states('sensor.bsb_lan_betriebsart') }}{% endif %}"
        attribute_templates:
          desc: "{% if states('sensor.bsb_lan_status') is defined and states('sensor.bsb_lan_status') != 'unavailable' %}{{ state_attr('sensor.bsb_lan_status', '8000')['desc'] }}{% else %}{{ state_attr('sensor.bsb_lan_betriebsart', 'desc') }}{% endif %}"
      bsb_lan_tww_nennsollwert:
        unique_id: bsb_lan_tww_nennsollwert
        friendly_name: BSB-LAN TWW Nennsollwert
        value_template: "{% if states('sensor.bsb_lan_status') is defined and states('sensor.bsb_lan_status') != 'unavailable' %}{{ state_attr('sensor.bsb_lan_status', '1610')['value'] }}{% else %}{{ states('sensor.bsb_lan_tww_nennsollwert') }}{% endif %}"
        unit_of_measurement: °C
        device_class: temperature

Die if Abfragen im Code sorgen dafür, dass die Sensoren ihren vorigen Wert behalten, auch wenn der “BSB-LAN Status” Sensor einmal kurzzeitig nicht verfügbar ist (z.B. beim Neustart von HA). Obiges Beispiel würde in Home Assistant die Sensoren sensor.bsb_lan_betriebsart und sensor.bsb_lan_tww_nennsollwert erzeugen.

Setzen von Parametern per REST & JSON

Für das Setzen von Werten empfiehlt es sich, zuerst ein allgemeines parametrisierbares RESTful Command zu definieren:

rest_command:
  bsb_lan_set_parameter:
    url: http://<BSB-LAN-IP>/JS
    method: POST
    username: !secret bsb_lan_user
    password: !secret bsb_lan_pass
    # Parameter "type": 1 = SET (default), 0 = INF
    payload: '{"Parameter": "{{ parameter }}", "Value": "{{ value }}", "Type": "{% if type is defined %}{{ type }}{% else %}1{% endif %}"}'

Dies erzeugt einen Service mit dem Namen rest_command.bsb_lan_set_parameter. Dieser Service lässt sich nun zum Setzen beliebiger Parameter nutzen.

Folgendes Beispiel erzeugt einen Schalter, mit dem man die Automatik-Betriebsart der Heizung an- und ausschalten kann:

switch:
  - platform: template
    switches:
    bsb_lan_betriebsart_automatik:
    friendly_name: BSB-LAN Betriebsart Automatik
    value_template: "{{ is_state('sensor.bsb_lan_betriebsart', '1') }}"
      turn_on:
      service: rest_command.bsb_lan_set_parameter
        data:
        parameter: 700
          value: 1
      turn_off:
      service: rest_command.bsb_lan_set_parameter
        data:
        parameter: 700
          value: 0

In Home Assistant ist dieser Schalter nun als switch.bsb_lan_betriebsart_automatik nutzbar. Wird er aktiviert, wird für den Parameter 700 der Wert 1 (“Automatik”) gesetzt. Deaktivieren setzt den Wert 0 (“Schutzbetrieb”). Wie man sieht, nutzt der Switch den weiter oben definierten Sensor sensor.bsb_lan_betriebsart, um seinen aktuellen Zustand (an/aus) zu ermitteln.

Folgender Code erzeugt zwei Automatisierungen, die man als Basis für ein Eingabefeld für den TWW Nennsollwert nutzen kann. Das Eingabefeld zeigt natürlich auch den aktuell eingestellten Wert an. Achtung: Der Code muss in die Datei automations.yaml eingefügt werden! Das Eingabefeld muss man zuvor per YAML definiert oder manuell in der Oberfläche unter “Einstellungen/Geräte & Dienste/Helfer” angelegt haben:

TWW Nennsoll

Alternativ das gleiche als YAML:

input_number:
  bsb_lan_tww_nennsollwert:
    name: BSB-LAN TWW Nennsollwert Input
    icon: mdi:thermometer
    mode: box
    min: 20
    max: 65
    step: 0.5
    unit_of_measurement: °C

Datei automations.yaml:

- id: bsb_lan_set_tww_nennsollwert
  alias: BSB-LAN TWW Nennsollwert setzen
  trigger:
    - platform: state
      entity_id: input_number.bsb_lan_tww_nennsollwert
  condition: []
  action:
    - data_template:
        parameter: 1610
        value: "{{ states('input_number.bsb_lan_tww_nennsollwert') }}"
      service: rest_command.bsb_lan_set_parameter
- id: bsb_lan_get_tww_nennsollwert
  alias: BSB-LAN TWW Nennsollwert auslesen
  trigger:
    - platform: state
      entity_id: sensor.bsb_lan_tww_nennsollwert
    condition: []
  action:
    - data_template:
        entity_id: input_number.bsb_lan_tww_nennsollwert
        value: "{{ states('sensor.bsb_lan_tww_nennsollwert') | float(0) }}"
      service: input_number.set_value

Der erste Trigger reagiert auf eine Änderung des Eingabefeldes und setzt entsprechend den Heizungsparamater mit Hilfe des oben definierten REST Commands. Der zweite Trigger reagiert auf eine Änderung des Parameters seitens der Heizung und aktualisiert entsprechend den Inhalt des Eingabefeldes.


BSB-LAN ist jetzt eine offizielle Home-Assistant-Integration, die von Willem-Jan betreut wird.
Die Dokumentation der Integration ist hier zu finden.
Vielen Dank!

BSB-LAN-User Florian hat die o.g. Lösung erweitert, so dass zwei Regler mit insgesamt vier Heizkreisen bedient werden können. Hier hat er seine Lösung zur Verfügung gestellt.
Vielen Dank!

Achtung
Die o.g. Integration ist z.Zt. nur mit der BSB-LAN-Version 1.0 kompatibel, NICHT mit der aktuellen Version! Für die Einbindung der aktuellen BSB-LAN-Version ist es daher empfehlenswert, die im Folgenden dargestellten Einbindungsmöglichkeiten mittels MQTT oder JSON zu nutzen.

8.12 SmartHomeNG

BSB-LAN-User Thomas hat ein Plugin für SmartHomeNG geschrieben und in seinem GitHub Repo zur Verfügung gestellt.
Vielen Dank!


8.13 Node-RED

BSB-LAN-User Konrad hat ein Modul für Node-RED geschrieben, das eine einfache Einbindung von BSB-LAN ermöglicht.
Vielen Dank!


BSB-LAN-User n300 hat eine “Queuing-Flow”-Erweiterung für das o.g. Node-RED-Modul geschrieben. Hierdurch werden Timeouts und/oder Connection Refuses (ECONNECTREFUSE) weitestgehend vermieden, die durch zeitgleiche Requests entstehen, da Requests nun zeitlich geordnet nach einander abgearbeitet werden. Der Flow und eine weitergehende Beschreibung sind hier zu finden.
Vielen Dank!


8.14 Datenverarbeitung mittels Bash-Skript

BSB-LAN-User Karl-Heinz hat zwei Bash-Skripte geschrieben, die unter Linux dazu verwendet werden können, Daten vom Heizungsregler auszulesen und mittels gnuplot graphisch darzustellen.
Vielen Dank!

Die Lösung von Karl-Heinz ist für diejenigen Nutzer interessant, die keine komplexe Heimautomatisierungssoftware einsetzen (wollen), um Daten unter Linux vom Heizungsregler abzurufen und graphisch darstellen zu lassen. Die Skripte stellt er freundlicherweise in seinem GitHub-Repo zur Verfügung.


8.15 Volkszaehler

BSB-LAN-User Michael hat ein Script geschrieben, mit dem sich die Daten von BSB-LAN in das Volkszaehler-Projekt einbinden lassen. Er stellt das Script samt einer Beschreibung in seinem GitHub-Repo zur Verfügung.
Vielen Dank!


8.16 Homebridge

BSB-LAN-User Michael hat ein Plugin für Homebridge geschrieben, das eine einfache Einbindung von BSB-LAN ermöglicht.
Vielen Dank!


8.17 Jeedom

BSB-LAN-User bernard-dandrea hat ein Plugin für Jeedom geschrieben (Beschreibung auf Französisch), das eine einfache Einbindung von BSB-LAN ermöglicht.
Vielen Dank!


ko-fi


Weiter zu Kapitel 9
Zurück zum Inhaltsverzeichnis