Comfobox (Elesta-Regler) auslesen (via MQTT)

Hallo,

hab schon mehrere Anläufe zum Auslesen der Betriebszustände (etc) des Reglers (Elesta) meiner Wärmepumpe (hier: Comfobox Serie 5) gestartet.

So, nun bin ich mit externer Hilfe dem Ganzen schon sehr nahe gekommen.
Ich kann die Daten aus den Regler bereits auslesen (auch schreiben) und in IPS (Webfront) einbinden.
Das ganz ist noch nicht wirklich serien-reif und hat ein paar Schönheitsfehler, aber es geht!

Ich versuche mal zu beschreiben wie ich es realisiert habe. Vielleicht findet sich hier ja jemand mit dem ich das weiter entwickeln kann.

Hintergrund:

  • Der Regeler der Wärmepumpe ist hier der Elesta (gibt auch Modelle mit nem Siemensregler)
  • Dieser kommuniziert mit der Bedieneinheit via RS485-Bus
  • Kommunikationsprache: BACnet MSTP

Technische Umsetzung:

  • RS485-BUS paralell zu Bedieneinheit anzapfen, auf RS485 -> USB- Konverter und dann an den Server.

Problem:

  • Mir zu kompliziertes Protokoll (BACnet)

Ich wurde ausserhalb diese Forums aber bzgl. letztem Punkt fündig: HIER

RF77 hat eine Bibliothek (bzw. fertige Programme) geschrieben um den Regler abzufragen und die Daten in MQTT umzusetzen. Dafür hat er einen Windows-Dienst geschrieben. Dabei ist auch ein Demo-Client, der ohne weitere MQTT-Werkzeuge sofort läuft.

Mein Problem war die Übertragung der Daten via MQTT in IPS.
Leider unterstützt IPS MQTT bislang noch nicht.

Mit folgendem (experimentellen) Script kann ich die Daten aber schon mal einlesen und weiter verwenden. Geht super.

Mein Problem:
Ich bekomme es bislang nicht hin, die MQTT-Daten im Hintergrund zu empfangen. Ich muß also untenstehendes Script für eine gewisse Zeit laufen lassen in welcher einfach alle derzeit gesendeten Daten abgefangen werden.
Das Script muss dann nach selbst definierter Zeit abgebrochen werden.

So gehts:
(1) „ComfoBox MQTT client“ von hier installieren (auf dem Rechner an dem die Comfobox angeschlossen ist), einrichten. Es läuft dann automatisch in HIntergrund (als WIndowsdienst). In der Text/Configurationsdatei „ComfoBoxService.exe“ muß ggf. noch entsprechenden COM-Port angeben und eventuel eine abweichende url des Brokers (siehe (2)) angegeben werden).
(2) MQTT-Broker (z.B. mosquitto) einrichten (am besten auf gleichem Rechner)
(3) Daten des Clients werden an den Broker gesendet und von dort bei Abfrage verteilt
(4) folgendes Script (mqtt-subscriber) an beliebiger Stelle anlegen (Name egal), darunter eine leere Kategorie anlagen (für die empfangenen Daten). Fertig

<?
// *****************************************************************************
// ** MQTT-Subscriber für ComfoBox
// ** es wird das script phpMQTT.php benötigt (in den /scripts-Ordner von IPS)
// *****************************************************************************
// ** Hardlog
// ** Stand 12.12.15 7:40
// *****************************************************************************
// Script beende sich automatisch nach 2sec.

// Konfuguration:

$OrdnerTopics=35758 /*[Hardware\ComfoBox\phpMQTT_einfach_subscriber\Merssages]*/;
$url_broker="localhost";
$Tout=2; // Laufzeit des Scripts (muss ausprobiert werden

// ** Hauptteil ****************************************************************

require("phpMQTT.php");

subscribeMQTT('ComfoBox/#');

// ************************ benötigte Funktionen *******************************

function subscribeMQTT($topic) {
	global $url_broker, $Tout;
	$T0=time();
	$mqtt = new phpMQTT($url_broker, 1883, "IPS-Server");
	if(!$mqtt->connect())
		{ exit(1); }
   $topics[$topic] = array("qos"=>0, "function"=>"procmsg");
   $mqtt->subscribe($topics,0);
   while($mqtt->proc())
	 {
		if ((time()-$T0)>$Tout) break; // vor ablauf der max_executen_time schleife beenden sonst Warnung
    }
    $mqtt->close();
 }

function procmsg($topic ,$msg){
	    global $OrdnerTopics;
		// empfangenen Wert in entsprechender Var (Topic) speichern, wenn Var noch nicht existent -> neu generieren
  	    if (is_numeric($msg)==TRUE)  {$VarType=1;}  // empfangene Massage ist vermutlich ein Float
 		 if (is_numeric($msg)==FALSE) {$VarType=3;}  // empfangene Massage ist vermutlich ein String
		 if (substr_count($msg,",")>0) {$VarType=2;} //empfangene Massage ist vermutlich ein Integer
		 
		 if (@IPS_GetVariableIDByName($topic, $OrdnerTopics)==FALSE) // neue Var anlegen wenn dieses Topic bisher noch nicht empfangen wurde
		  {
				$VarID = IPS_CreateVariable($VarType);
		   	IPS_SetName($VarID, $topic); // Variable automatisch den Namen des entsprechenden Topics geben
				IPS_SetParent($VarID,$OrdnerTopics); // Variable einsortieren unter dem Objekt mit der $OrdnerTopics
	      	SetValue($VarID, $msg); // Message des entsprechenden Topics speichern
		  }
		 else
		  {
		    	SetValue(IPS_GetVariableIDByName($topic, $OrdnerTopics), $msg);
		  }
 }
?>

Für diese Script wird diese php-Bibliothek benötigt.

Das Script sollte nun nach manuellem (oder zyklischem) Start die empfangen Daten unter dem entsprechenden Topic-Namen im angeleten Ordner/Kategorie ablegen.

Noch bestehende Probleme, wo ich Hilfe / Ideen gebrauchen kann:

  • am liebsten wäre mir ein MQTT-Client der auf Linux/Raspberry läuft! Kann jemand mit den hier veröffentlichten Bibiliotheken etwas entsprechendes umsetzten (ist mir zu hoch)?
  • wie könnte man einen MQTT-Subscriber realisieren, der ständig im Hintergrund (von IPS) die Daten abfragen und bei Bedarf ablegt.

hardlog

Hallo hardlog,

Diese Anbingung an die Comfobox läuft nun seit einiger Zeit problemlos auf meinem Raspberry Pi.

Grüsse
hotsnow (aka RF77)