LAN-Anbindung für BSB-Bus (Brötje, Elco Thision etc.)

Begonnen von justme1968, 29 November 2014, 19:50:40

Vorheriges Thema - Nächstes Thema

fredje

@freetz .. generellen Zugriff habe ich .. die Logs sende ich morgen, komme heute nicht mehr dazu .. Danke

Du darfst diesen Dateianhang nicht ansehen.

fredje

Hallo freetz, danke für deine Hilfe .. bin nochmals an den Rechner, was meinst du mit SerMo-Log ? Habe eine Filelog vom Mqtt2 Server, da steht aber nicht viele.
Verbose 5 ist für den Mqqt2 Server definiert.

2023-11-05_15:14:36 MQTT2_Server nrclients: 1
2023-11-05_15:14:36 MQTT2_Server nrclients: 2
2023-11-05_15:14:36 MQTT2_Server nrclients: 3
2023-11-05_15:15:01 MQTT2_Server nrclients: 4
2023-11-05_15:15:31 MQTT2_Server lastPublish: Broetje:S6110=14
2023-11-05_15:17:25 MQTT2_Server lastPublish: Broetje:S6110=15
2023-11-05_15:21:28 MQTT2_Server lastPublish: Broetje:S6110=15
2023-11-05_15:25:09 MQTT2_Server nrclients: 3
2023-11-05_15:25:16 MQTT2_Server nrclients: 4
2023-11-05_15:27:22 MQTT2_Server lastPublish: Broetje:S6110=15
2023-11-05_15:34:52 MQTT2_Server lastPublish: Broetje:S882=20

Du darfst diesen Dateianhang nicht ansehen.

aViN187

Zitat von: freetz am 29 Oktober 2023, 17:56:26@aViN187: Den Reconnect macht BSB-LAN dann, wenn das ursprünglich gewünschte WLAN nicht gefunden wurde oder nicht mit der bevorzugten BSSID verbunden wurde oder die WLAN-Verbindung abgebrochen ist. Das ist also ein Netzwerk- oder Konfigurationsproblem. Mit dem Ping hängt das nur insofern zusammen, dass beide zu den gleichen Zeitintervallen (nacheinander) abgearbeitet werden.

kurze Rückmeldung. Da ich mehrere AP's habe ist er ohne manuelles setzen der BSSID nicht klargekommen. Nachdem ich die BSSID gesetzt habe funktioniert nun alle stabil wie es soll.

Danke

wgary

#6693
[quote author=Scherheinz link=msg=1046673 date=1587754621]
[quote author=Schotty link=topic=29762.msg1044584#msg1044584 date=1587310011]
@Scherheinz: Dann melde dich am besten einfach, wenn du die finale Version hast, derzeit komme ich eh nicht dazu, das im Handbuch zu ergänzen..
[/quote]
if (!MQTTClient.connected()) {
      MQTTClient.setServer(MQTTBroker, 1883);
      int retries = 0;
      while (!MQTTClient.connected() && retries < 3) {
        MQTTClient.connect("BSB-LAN", MQTTUser, MQTTPass);
        retries++;
        if (!MQTTClient.connected()) {
          delay(1000);
          DebugOutput.println(F("Failed to connect to MQTT broker, retrying..."));
        }
        MQTTClient.publish("AkkuSpannung",dtostrf(akkuSpg, 6, 1, tempBuffer));
        MQTTClient.disconnect();
      }
    }
}

[/quote]

Hallo,
ich bin neu mit EPS32 & BSB-LAN unterwegs.
Ich lebe im Raum Wien und betreue 2 Elco Heizungen. Bei einer habe ich Remko NetB im Einsatz, das kostet bei uns aber ca. 240,- und die Funktionalität der App ist sehr überschaubar.

Nun bin ich auf BSB-LAN aufmerksam geworden. Board war schnell bestellt. Installation und die Verbindung mit einem Elco Ölbrenner haben super funktioniert. Ebenso das Auslesen der Daten über iobroker.

Ich habe nun einen Ultraschall-Sensor ins BSB-LAN eingebunden, die Messung bzw. Ausgabe über Seriellen Monitor funktioniert.
Aber ich bekomme MQTT nicht zu laufen. Habe den Code von Scherheinz adaptiert, bekomme aber Fehler beim Kompilieren:

  // print the value to Serial Monitor
  Serial.print("distance: ");
  Serial.print(distance_cm);
  Serial.println(" cm");

  if (!MQTTClient.connected()) {
    MQTTClient.setServer(MQTTBroker, 1883);
    int retries = 0;
    while (!MQTTClient.connected() && retries < 3) {
      MQTTClient.connect("BSB-LAN", "User", "Pass");
      retries++;
      if (!MQTTClient.connected()) {
        delay(1000);
        DebugOutput.println(F("Failed to connect to MQTT broker, retrying..."));
      }
      MQTTClient.publish("OelStand", dtostrf(distance_cm, 7, 2, tempBuffer));
      MQTTClient.disconnect();
    }
  }

In file included from C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN.ino:7405:
C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN_custom.h: In function 'void loop()':
C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN_custom.h:36:8: error: 'MQTTClient' was not declared in this scope
C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN_custom.h:36:8: note: suggested alternative: 'ComClient'
C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN_custom.h:37:26: error: 'MQTTBroker' was not declared in this scope
C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN_custom.h:44:9: error: 'DebugOutput' was not declared in this scope
C:\pfad\BSB-LAN-master\BSB_LAN\BSB_LAN_custom.h:44:9: note: suggested alternative: 'DebugBuff'
exit status 1
Compilation error: 'MQTTClient' was not declared in this scope

Habt ihr einen Tipp, wie ich den MQTTClient Fehler weg bekomme?
Alternativ stell ich mir die Frage, wie ich das Ergebnis der Messung z.B. als Parameter im Bereich 10200.. speichern kann.
Oder kann ich den Wert im Webserver einbinden? Dann könnte ich vom iobroker via parser zugreifen.

danke & mfg
Wolfgang

BSB_User_23

Hallo Zusammen,

ich hoffe, dass ich alles richtig mache, indem ich einfach mal auf diesen Thread antworte ...

Ich habe vor Kurzem mein BSB-LAN in Betrieb genommen (auf Olimex EVB), und bin absolut begeistert - und gar überrascht, wie viele Informationen BSB-LAN auslesen, für die mein Regler anscheinend gar keinen Fühler/Sensor hat.

Zur Frage: Ist es möglich bzw. sinnvoll, Temperaturwerte (ausgelesen via komplett separatem ESP32 mit DS18B20-Sensoren aufgrund räumlicher Distanz) via LAN (z.B. HTTP API) in BSB-LAN zu setzen? Ich habe das Handbuch durchgesehen, und die Möglichkeit des Setzen von Werten gesehen, wollte aber kurz erfragen, ob das eine sinnvolle Anwendung ist, und welchen Weg ich am besten gehen sollte (1. welche API, 2. welche Nummernkreise verwenden (Werte in Sensor-Nummernkreisen oder gar den Reglerwerte überschreiben <-- Letzteres wahrscheinlich keine gute Idee)).

Die andere Unklarheit bezieht sich auf meine Olimex EVB, an dem der Adapter angeschlossen ist. Das Handbuch gibt an, dass bei Verwendung des BSB-LAN-Adapters nur wenige andere Pins noch verwendbar sind (Original "Beim Olimex ESP32-EVB ist der Anschluss weiterer Hardware lediglich an den beiden GPIO-Pins 13 (I2C-SDA) und 16 (I2C-SCL) möglich."). Kann ich diese Pins nutzen, um One-Wire-Sensoren (wie die DS18B20) zu betreiben bzw. gibt es irgendwelche Einschränkungen bei der Nutzung dieser Pins? Ich tue dies zur Zeit noch nicht (wie oben beschrieben), aber mein Gedanke ist später zusätzliche Leitungstemperaturen auszulesen, die räumlich näher liegen, sowie andere Sensoren (z.B. Feuchtigkeit zwecks Früherkennung von Kondenswasseraufbau) anzuschliessen.

Ich hoffe, dass meine Erklärungen Sinn machen. Ansonsten kann ich natürlich weiter ausführen.

Vielen Dank für jede Antwort bzw. Gedanken oder Verweis (sollte ich im Handbuch etwas übersehen haben, das Antwort auf das oben Beschriebene gibt).

Beste Grüße!


sdr_herrmanns

Zitat von: Bratmaxe am 30 Oktober 2018, 16:16:21So hier könnt ihr euch das Skript ja mal ansehen. Ich habe jetzt viele Parameter damit ausgelesen und keinen Fehler mehr gefunden.
Dennoch geschieht die Benutzung auf eigene Gefahr, ich kann nicht ausschließen, das irgendwo noch der Fehlerteufel zuschlägt.

Ich übernehme keinerlei Haftung für die Verwendung des Skriptes!

Kurze Beschreibung:
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
! 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 Parameterzahl in der Beschreibung der Systemvariable kann man entfernen, wenn man Zeile 59
!Info = Info.Substr(Wort.Length(), stdout.Length()); einkommentiert, ich habe mich aber absichtlich für den Wert mit Parameternummer entschieden, da ich dann mit einem weiteren Skript den Parameter automatisch aus der Info auslesen und über BSB-Adapter setzen kann. (Skript muss ich aber noch erstellen)

Edit 31.10.2018: Skript zum Setzen der Parameter hinzugefügt:
Kurzbeschreibung:
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 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!

! 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("%")){ stdout = stdout.Replace("%","%"); }
!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."); }


Edit: 05.11.2018:
Für die Abfrage der Fehlercodes habe ich noch ein weiteres Skript verfasst, da hier mehrere Wörter abgefragt werden müssen, damit der Fehler eindeutig mit Datum abgefragt wird.
mit "AnzahlFehler" kann man einstellen, wie viele Fehler abgefragt werden sollen Meine Heizung mit ISR-Plus speichert bis zu 20 Fehler ab.
Ich lasse das Skript alle paar Stunden laufen und lasse mich dann benachrichtigen, wenn die Variable sich ändert, somit erhalte ich innerhalb kurzer Zeit die Info, wenn an der Heizung was nicht stimmt!

! 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); }


Ansonsten wünsche ich viel Spaß beim Ausprobieren. Sollten ihr Fehler finden, gerne direkt per PN an mich!

Edit - 15.11.2019 - Skript aktualisiert

Gruß Carsten


Hallo ich bin total neu hier und würde gerne dieses Skript bei mir in die Homematic einfügen, ich benutze Raspberrymatic. Könnte mir jemand freundlicherweise helfen, wie und wo ich das Skript einfügen muss? Viele Grüsse und danke!

henschwa

Moin,

mein BSB-LAN-Adapter rennt und liefert Daten. Ich kann fast alle Werte setzen, nicht jedoch die Komfort-Temperatur (Zieltemperatur) über Parameter 710 oder 10.000.

Im der Config ist "#define DEFAULT_FLAG 0" und es kommt bei Param. 10000 die Fehlermeldung "FEHLER: Setzen fehlgeschlagen!".

Liegts an der IDA, die noch an dem anderen BUS-Eingang meiner Brötje EVO 20 hängt?

Besten Dank für Tipps jedweder Art ...

Gruß
Hendrik

freetz

@all: Sorry, dass ich wieder keine Benachrichtigungen bekommen habe, dass es neue Beiträge gibt. Auf der anderen Seite ist es allerdings auch etwas deprimierend, wenn sonst kein User mal eine der (teilweise schon mehrfach beantworteten bzw. im Handbuch erwähnten) Fragen beantworten kann.

Zu den Posts:
@fredje: Was ein SerMo-Log ist, steht im Handbuch, und auch wie man es anfertigt. Es ist ein Log über den Serial Monitor der Arduino IDE vom Booten von BSB-LAN bis zu dem Punkt, wo der Fehler auftritt.
@aViN187: Danke, das ist genau der Grund, warum die Funktion eingeführt wurde, denn bei mehreren APs verbindet sich BSB-LAN ohne Angabe der BSSID auch gerne mal mit dem, der sich als erstes meldet, aber nicht der stärkste AP ist.
@wgary: Der Code von Scherheinz ist glaube ich schon mehrere Jahre alt, da hat sich inzwischen einiges in BSB-LAN verändert, so dass der Code so nicht mehr laufen wird. Ich habe leider nicht die Zeit dafür, individuelle Code-Bestandteile zu supporten, tut mir leid...
@BSB_User_23: Ob es für Dich Sinn macht, dass Du die Raumtemperatur anders als über das Raumgerät übermittelst, musst Du selber anhand von Deiner Situation abhängig entscheiden. Was die freien Pins angeht, sind diese im Handbuch aufgeführt und es ist auch beim Olimex möglich, DS18B20-Sensoren anzuschließen und auszuwerten.
@sdr_herrmanns: Ich benutze kein Homematic und kann Dir von daher nicht weiterhelfen. Entweder müsstest Du den User Bratmaxe direkt anschreiben oder Dich in einem Homematic-Forum schlau machen.
@henschwa: Parameter 10000 wird nicht über /S, sondern über /I gesetzt, letzteres ist über das Webinterface nicht möglich, so dass Du die Temperatur direkt über die URL setzen musst.



Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

freetz

Gibt es hier im Forum jemanden, der einen Siemens Regler mit dem OCI351 ModBus Plugin hat?
Zum einen würde mich interessieren, ob die abgerufenen Register auch als BSB/LPB-Telegramme über den Bus gehen und zum anderen würde ich versuchen wollen, die relativ simple ModBus-Anbindung, die ich jetzt in der custom_functions Bibliothek hinterlegt habe, möglichst zu dem offiziellen Modul kompatibel machen zu wollen. Schon jetzt ist es darüber möglich, Standardparameter über ModBus zu lesen und zu schreiben, aber da ModBus in vielen Punkten nicht standardisiert ist, würde mich die Umsetzung von Siemens interessieren...
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

schoeni

Zitat von: schoeni am 01 Oktober 2022, 10:31:398310 Kesseltemperatur: Zu hohe Temperaturwerte, wenn Feststoffkessel in Betrieb
Hallo,
ich nutze seit ein paar Monaten einen gebrauchten Arduino Mega 2560 aus dem Forum hier mit Version 0.44.17-20200511114737BSB-Lan zum Loggen u.a der Temperaturen von Ölkessel und Feststoffkessel. Die Temperaturfühler hängen an einer Brötje ISR-SSR.
Den Sommer über war der Ölkessel wegen Solarthermie und PV-Heizstab nur wenig in Betrieb. Es wurden aber plausible Werte geloggt.
Jetzt wo zusätzlich der Feststoffkessel in Betrieb ist, scheint es, wie wenn unregelmäßig die Temperaturen vom Feststoffkessel 8560 als Ölkesseltemperatur 8310 ausgegeben werden. Auch wenn der Ölbrenner gar nicht in Betrieb ist.
Die Brötje Heizungssteuerung funktioniert an sich. Es werden nur falsche (zu hohe) Temperaturen für den Ölkessel im BSB-Lan angezeigt.

Ist dieser Fehler bekannt?
Gruß Rainer

Hallo, das Thema vom 1.10.2022 ist immernoch aktuell. Immer wenn Feststoffkessel und Ölbrenner gleichzeitig in Betrieb sind, ist die geloggte Temperatur vom Ölkessel (8310) zeitweise identisch mit der Feststoffkesseltemp (8560). Manchmal ist ein Wert vom Ölkessel niedriger, aber schon der nächste Log nach 5 min zeigt wieder die Feststoffkesseltemperatur.
Die Anzeige der Steuerung zeigt jedoch die richtigen Werte.   
Wenn in der Nacht der Feststoffkessel nicht in betrieb ist, funktioniert das Loggen der Ölkesseltemperatur. Seit heute morgen folgt die Ölkesseltemperatur genau dem Feststoffkessel. Deshalb ist die Linie nicht zu sehen.

Kann es sein, das die "Schienenvorlauftemperatur" geloggt wird? In der Steuerung ist meistens die Feststoffkesseltemperatur angezeigt.

Eine "Vermischung" des Heizwassers vom Feststoffkessel und Ölbrenner findet zwar im Pufferspeicher statt. Aber Feststoffkessel und Ölkessel können sich gegenseitig temperaturmäßig nich beeinflussen.

Das Updaste zu V1.1 brachte keine Verbesserung.
Update auf aktuelle Version: Ich möchte ungern in neue Hardware installieren und der Fehler ist immer noch da.

Ich nutze BSB-Lan zum Umschalten der Betriebsarten und schaue mir gerne die Temperaturen im Pufferspeicher an, bevor ich selbst entscheide ob der Heizstab im PV-Strom auf dem Speicher in Betrieb gehen soll, damit im Sommer kein Öl verbraucht wird.

Hat jemand einen Lösungsvorschlag?
Gruß, Rainer







Schotty

Hi schoeni,

wenn bei deinem Modell nicht die Schienenvorlauftemperatur 8950 von der Regelung als Kesseltemperatur 8310 angezeigt wird, dann nicht.. 

Zitat von: schoeni am 04 Januar 2024, 10:24:41Eine "Vermischung" des Heizwassers vom Feststoffkessel und Ölbrenner findet zwar im Pufferspeicher statt. Aber Feststoffkessel und Ölkessel können sich gegenseitig temperaturmäßig nich beeinflussen.

Das wiederum scheint mir in deinem Fall fraglich zu sein, denn für mich scheint es so, als wenn der Kessel irgendwie mit erwärmt wird. Sei es durch eine ungewollte Zirkulation des PS-Wassers zum Kessel oder um eine gewollte RLA. Letzteres erscheint mir wahrscheinlicher, da diese Art der Installation leider auch zu Zeiten von Brennwertgeräten von etlichen Installateuren noch immer gerne gemacht wird/wurde.. Um das herauszufinden müsstest du dir den Hydraulikplan der Anlage vornehmen und ggf mit dem Installateur Rücksprache halten. 
Handbuch zur BSB-LAN Hard- & Software (Anbindung v. Heizungsreglern, u.a. von Brötje & Elco):
https://1coderookie.github.io/BSB-LPB-LAN/

freetz

Wenn Du nicht die aktuelle Version nutzt, kann sich hinter den Textbezeichnungen der Parameter letztlich alles verbergen. Es gibt eine Menge Regler, die für die gleiche Parameternummer unterschiedliche Telegramme verwenden und das gleiche Telegramm dadurch letztlich auch andere Bedeutungen haben kann. Es kann auch sein, dass ein Telegramm bei Dir grundsätzlich funktioniert, aber einen willkürlichen Wert zurückliefert. Deswegen werden die alten Parameter nicht mehr supportet, weil eben niemand wirklich sagen kann, welcher Parameter "richtig" ist, wenn man es nicht wirklich an der eigenen Heizung überprüft hat.
Deswegen ist die gerätespezifische Parameterliste die einzig "wahre" Lösung, weil der Regler hierbei selber sagt, was er kann und was nicht.

Davon ab würde ich auch, wie Schotty schon rät, die Hydraulik mal genauer anschauen. Mein wasserführender Ofen ist auch über eine Rücklaufanhebung eingebunden. Die Gastherme ist zwar über einen Wärmetauscher nicht direkt verbunden, aber es findet natürlich trotzdem ein Temperaturaustausch statt, insbesondere dann, wenn z.B. die Pumpe des Gasers laufen sollte. Dann könnte es theoretisch auch zu einer Angleichung der Temperatur im Kessel kommen.
Alle Infos zur Anbindung von Heizungssystemen mit PPS-, LPB- bzw. BSB-Bus ans LAN gibt es hier:
https://github.com/fredlcore/bsb_lan

Alle Infos zum WLAN-Interface "Robotan" für Ambrogio/Stiga/Wolf und baugleiche Rasenmähroboter:
https://github.com/fredlcore/robotan

schoeni

Hallo Schotty, Hallo Freetz,
ich schaue morgen, ob ich die Parameter für die Kesseltemperatur aus der Steuerung RVS63.283/200  herausbekomme.

Fakt ist, das die Steuerung realistische Werkte für die Kesseltemperatur des Ölbrenner anzeigt, aber BSB-LAN andere Werte für "8310" loggt.
Der Ölbrenner ist hydraulisch mittig an den Schichtenspreicher angeschlossen. Der Kesselfühler ist an B2 (KVF) angeschlossen. Der Feststoffkessel holt kaltes Wasser aus dem Schichtenspeicher ganz unten und gibt das heiße Wasser ganz oben in den Schichtenspeicher zurück. Der Fühler ist an BX2 (TWF2) angeschlossen.
Vielen Dank soweit!

schoeni

Zitat von: freetz am 04 Januar 2024, 11:14:13Deswegen ist die gerätespezifische Parameterliste die einzig "wahre" Lösung, weil der Regler hierbei selber sagt, was er kann und was nicht.
Hallo,
im Anhang sind die ausgelesenen Parameter.

Kann damit eine Parameterliste generiert werden?

Akutell ist der Ölbrenner über den Notschalter ausgeschaltet, denn die ISR - Steuerung hat die Freigabe für den Ölbrenner gegeben aber der  Feststoffkessel ist nach der Reinigung gleich wieder auf Temperatur.
Nach dem Löschen der Logdaten mit DO wurde mit dem 1. log die richtige Kesseltemp. von 35,3 °C gemessen.
 Die weiteren Messungen entsprechen aber der Feststoffkesseltemp! Obwohl der Ölbrenner gar nicht läuft. (Siehe Datenlog).
Unter 8310 wird immernoch ca. 35°C ausgegeben.
Die Schienenvorlauftemperatur 8950 entspricht jetzt der Feststoffkesseltemp.


schoeni

Problem gelöst!
Ich habe im Ein-/Ausgangstest gesehen, das die Kesseltemperatur mit Code "7760" korrekt angezeigt wird. Ich habe diesen anstelle "8310" eingetragen. Jetzt wird die korrekte Kesseltemperatur geloggt.