MQTT Protokoll Integrieren?

Was länge wärt wird endlich gut.
Ich habe ein Funktionierendes MQTT Modul.

Unter GitHub - thomasf68/IPS_MQTT: MQTT Modul fuer IP-Symcon 4.1 zu finden.

Doku in der Read.me

Klasse :slight_smile:

werde ich heute oder morgen versuchen zu testen

astrastar

Sauber ! Vielen dank für deine Mühe und Arbeit !!!

Hallo Thomas,

habe Dein Modul in mein IPS integriert und kann auch schon senden.:slight_smile: Vielen Dank für die Arbeit.
Nur bekomme ich keine Messages rein. :mad:
Ich habe als MQTT-Broker den Mosquito auf dem IPS-Rechner unter WIN 10 laufen. Das PHP-Modul ist folgendermaßen eingestellt
MQtt1.JPG
Als Handel Script habe ich Deine Vorlage verwendet. Nun dacht ich, es muß zumindest jede Minute eine Ausgabe im Log erscheinen, aber da kommt nichts. Auch im Debug-Modus der Schnitstelle ist nichts zu sehen.
Wenn ich mit

MQTT_Publish(27594 /*[MQTT Client]*/, $topic, $content, $qos = 0, $retain = 0);

sende wird aber schon etwas angezeigt und mein Sonoff reagiert auch. Nun hätte ich aber auch gern den SAtatus mittels MQTT abgefragt. Irgend eine Idee?

Hallo,

die Debugmeldungen kommen im Debug Fenster des MQTT Moduls. Im Fenster Meldungen kommen keine speziellen Meldungen.

Der Befehl „MQTT_Subscribe“ meldet das Empfangen an. ‚#‘ steht als Platzhalter für alles.
$topic = „#“;
MQTT_Subscribe(41440 /[MQTT Client]/, $topic, 0);

Man kann zum Testen es auch mit dem Topic ‚$sys/#‘ versuchen dann bekommt man von dem MQTT-Broker eine menge Systemmeldungen.

Hast du in dem Handel Script die ID des MQTT Moduls angepasst ?

Viel Erfolg

Thomas

Hallo Thomas,

ja das war es, vielen Dank. Ich hatte vergessen im Handler-Script unter MQTT_Subscribe die richtige InstanzID einzutragen. :banghead:. Nun funktioniert es super. :smiley: Meine Sonoff Messages trudeln zuverlässig ein. Leider werden nur String-Variablen angelegt, obwohl ich schon einen Test auf den Vartyp vorgeschaltet habe. Wenn ich aber nach der Anlage von z.B. Power, welche als 0 oder 1 ankommt, die Variable auf bool ändere klappt es und ich kann die Variable direkt im Webfront verwenden.
Bin total begeistert und habe jetzt schon 4 sonoff Switches, teilweise mit zusätzlichem Sensor, im Einsatz und hoffe, dass sich das MQTT-Protokoll weiter durchsetzt.

Nachdem ja viele mit den Sonoff rumbasteln würde ich mich ja mal freuen wenn da mal einer alles Wissen zu IPS zusammenfasst oder vielleicht sogar alles in ein Modul kippt ;).

Das hat doch Daniel schon gemacht.
Schau mal hier :wink:

Oh ja, danke. Da hatte ja auch Kai geschrieben das er da vielleicht ein Modul bastelt wenn er denn mal Zeit hat.

Hallo,

Die Zahl am Ende vom Topic gibt den Variablen Type an. Es ist 0 bis 3 zulässig. Die Zuordnung kann man der IPS Doku endnehmen. (IPS_CreateVariable)

Gruß

Thomas

Erst mal ein Lob an den Entwickler :slight_smile:

Das Modul lief auf Anhieb.
leider habe ich erst bisschen spät gesehen das das PHP-Script Variablen anlegt … wenn man sich an einen Public Broker verbindet bisschen doof :rolleyes:

Bin gerade am überlegen aber SSL wird erst mal nicht unterstützt, da die Verschlüsselung nicht durch den Socket (in IPS) gewährleistest wird sondern im Modul implementiert werden müsste!?
Sehe ich das so richtig?

Hm das Modul wirft auf einmal Fehler aus:

Bildschirmfoto 2017-04-29 um 17.43.51.png

29.04.2017 17:43:42*| ScriptEngine*| Result for Event 56964
<br />
<b>Warning</b>: require_once(/var/lib/symcon/modules/IPS_MQTT/MQTT_clienet/module.php): failed to open stream: No such file or directory in <b>/var/lib/symcon/scripts/__generated.inc.php</b> on line <b>48</b><br />
<br />
<b>Fatal error</b>: require_once(): Failed opening required ‚/var/lib/symcon/modules/IPS_MQTT/MQTT_clienet/module.php‘ (include_path=’.:’) in <b>/var/lib/symcon/scripts/__generated.inc.php</b> on line <b>48</b><br />

Hast Du auf 4.2 geupdatet?
Ab da dürfen in den Modulen keine zusätzlichen Verzeichnisse enthalten sein. Und bei MQTT ist da ein Verzeichnis mit der Beispieldatei enthalten. Dieses löschen und es sollte wieder gehen. :smiley:

Was noch komisch ist, bei manchen Payload zeigt er als ersten zwei Zeichen immer vierecke an :

Aber woher kommt das ?

Hallo,

die kommen von dem Programm das den Payload erzeugt. Die Vierecke sind nicht in ASCII darstelbare Codes. Im Debug Fenster des MQTT Moduls kann man den Payload in HEX Darstellung sehen. Das giebt vieleicht aufschlus.

Hat der Tipp mit 4.2 und dem Verzeichnis geholfen?
Positive Rückmeldungen werden auch gerne gelesen. :slight_smile:

Hi danke für deine Antwort…

die kommen von dem Programm das den Payload erzeugt. Die Vierecke sind nicht in ASCII darstelbare Codes. Im Debug Fenster des MQTT Moduls kann man den Payload in HEX Darstellung sehen. Das giebt vieleicht aufschlus.

No, nur bei deinem Modul taucht das auf, sonst bei keinem anderem MQTT Client :confused::confused:

Ja danke der Tip hat geholfen…

Dank Thomas68 MQTT Modul für Symcon (Vielen Dank!!!) ist es mir nach etwas Basteln gelungen, über das MQTT Protokoll ein paar Sonoff Geräte in Symcon einzubinden. Features sind:

[ul]
[li]Bidirektionale Kommunikation rein über MQTT Broker (mosquitto), nicht zusätzlich über HTTP GET Aufrufe
[/li][li]Relevante Meldungen von MQTT werden in Symcon Variablen abgelegt, die ggf. automatisch erzeugt werden.
[/li][li]Das Schalten der POWER Variable in Symcon (z. B. über WebFront) führt zu einem Schaltbefehl an MQTT
[/li][/ul]
Nachdem das ein etwas anderer Einsatzzweck ist als Thomas’ Übertragung von Variablenänderungen von einer Symcon Instanz via MQTT zu einer anderen Instanz hier mal meine Beschreibung, wie ich dieses Setup erreicht habe. Insbesondere die PHP-Skripte für MQTT Handler und Publisher, die auf Thomas’ Vorlagen basieren, sind noch nicht ganz so elegant und ausgereift, aber vielleicht mag ja hier jemand weitermachen…

Benötigt wird:

[ul]
[li]Sonoff Device mit neuer Sonoff-Tasmota Firmware, die MQTT spricht
[/li][li]Raspberry Pi, der mit mosquitto als MQTT Brokerkonfiguriert wird (und natürlich nebenbei auch Symcon beheimaten kann)
[/li][li]Thomas’ MQTT Client Modul installiert in Symcon unter Kern Instanzen / Modules
[/li][/ul]

  1. Sonoff Device mit der neuen Sonoff-Tasmota Firmware (aktuell 5.1.3) ausstatten. Ich habe mir dazu einen einfachen USB-Serial Adapter (SunFounder FT232RL FTDI USB to TTL Serial Adapter) und eine 3,3V Spannungsversorgung besorgt. Wie man mittels Arduino IDE die Software übersetzt und überspielt ist sehr gut im Wiki beschrieben. Auch die WLAN-Konfiguration sollte kein Problem sein. Hier noch meine MQTT Konfiguration des Sonoff. Interessant ist vielleicht, dass ich unter Full Topic %topic% und %prefix% anders als in den früheren Firmwares angeordnet habe. Damit gibt es in Symcon einen etwas übersichtlicheren Variablen-Baum.

  2. Installation des MQTT Broker auf dem Raspberry mit

sudo apt-get install mosquitto mosquitto-clients

. Ich habe die Default-Konfiguration genommen, d.h. kein Username / Passwort. Im internen Netz erst mal ok. Mittels

sudo service mosquitto status

den Status überprüfen. Dann kann man mit

mosquitto_sub -d -t "#"

alle MQTT Nachrichten anzeigen lassen oder mit

mosquitto_pub -t /home/sonoff1/cmnd/POWER -m ON

das Relais anschalten.

  1. In Symcon eine MQTT Client Instanz anlegen und mit einer Client Socket Instanz mit mosquitto auf dem Raspberry verbinden:
    mqttclient.pngmqttclient_socket.png

  2. Als Handel Script wird folgendes Skript „MQTT Handler“ angelegt und im MQTT Client ausgewählt

<?

$type_arr = array(
	'power' => array( 'vartype' => 0, 'on' => 1, 'off' => 0 ),
	'power1' => array( 'vartype' => 0, 'on' => 1, 'off' => 0 ),
	'power2' => array( 'vartype' => 0, 'on' => 1, 'off' => 0 ),
	'power3' => array( 'vartype' => 0, 'on' => 1, 'off' => 0 ),
	'power4' => array( 'vartype' => 0, 'on' => 1, 'off' => 0 ),
	'result' => array( 'vartype' => 3 ),
	'state' => array( 'vartype' => 3 ),
);

    // IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],print_r($_IPS,true));
if( $_IPS['SENDER']=='MQTT_GET_PAYLOAD' ) {
	$msg = $_IPS['MSG'];
    $topic = explode( "/", $_IPS['TOPIC'] );
    $id_parent = 0;
    $last = count($topic) - 1;
    $type = strtolower( $topic[$last] );
	
	if( array_key_exists( $type , $type_arr )) {
		$msg_lower = strtolower( $msg );
		IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],print_r($type,true));
		IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],print_r($type_arr[$type],true));
		if( array_key_exists( $msg_lower, $type_arr[$type] )) {
			$msg = $type_arr[$type][$msg_lower];
		}
		$type = $type_arr[$type]['vartype'];
	}
	
    switch( $type ) {
    	case '0':
        case '1':
        case '2':
        case '3':
        	foreach($topic as $i => $vname) {
				$id = @IPS_GetObjectIDByName($vname, $id_parent);
                if( $id === false ) {
					//if($last == $i) {
                   	//	$id = $id_parent;
                    //} elseif( $last-1 == $i ) {
					if( $i == $last ) {
						$id = IPS_CreateVariable($type);      
                        IPS_SetName($id, $vname); 
                        IPS_SetParent($id, $id_parent);
                    } else {
                    	$id = IPS_CreateCategory();      
                        IPS_SetName($id, $vname); 
                        IPS_SetParent($id, $id_parent);
                    }
                }
                $id_parent = $id;
            }
            SetValue( $id, $msg ); 
            break;
    	default:
            IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],"Topic '".$_IPS['TOPIC']. "' endhält keine Typinfo");		
    }
}

if($_IPS['SENDER']=='MQTT_CONNECT') {
    $topic = "#";														
    MQTT_Subscribe( 38876 /*[MQTT Client]*/, $topic, 0);	  // ID Anpassen !!!
}

?>

Wichtig ist das Array zu Beginn. Hier wird definiert, welche Topics (d.h. letzte Elemente des MQTT Topics) von Symcon ausgewertet und in Variablen geschrieben werden. Ggf. wird die Variable automatisch angelegt, dafür wird der Symcon Variablentyp aus vartype genommen. MQTT Messages wie „ON“ oder „OFF“ werden auf die entsprechenden Symcon Werte gemappt (z. B.vartype 0 ist Boolean, daher ON → 1 und OFF → 0). Alle Angaben in Kleinbuchstaben.
Jetzt sollten schon automatisch Kategorien und Variablen in Symcon angelegt werden, wenn man z. B. das Sonoff Relais durch den lokalen Taster ein- und ausschaltet.

  1. Um Variablenänderungen in Symcon wieder an MQTT zurückzumelden, sucht man sich die stat/POWER Variable, konfiguriert diese Variable mit Profil ~Switch und folgendem Aktionsskript „MQTT Publish“:
    symcon_POWER.png
<?

// IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],print_r($_IPS,true));
// if( $_IPS['SENDER']=='Variable' ) {

if( $_IPS['SENDER'] == 'WebFront' ) {
	$id = $_IPS['VARIABLE'];
	$topic = create_path($id);
	$msg = $_IPS['VALUE'];
	 
	if( $msg === false ) { 
		$msg = 'off';
	} elseif( $msg === true ) {
		$msg = 'on';
	}

	$info = IPS_GetVariable($_IPS['VARIABLE']);
	$type = $info['VariableType'];
	// $topic .= '/' . $type;
	 
	MQTT_Publish( 38876 /*[MQTT Client]*/, $topic, $msg, 0, 0 );
	// IPS_LogMessage( IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'], print_r(array('topic'=>$topic,'msg'=>$msg),true));

}


function create_path($id) {
    $path='';
    do {
    	$obj = IPS_GetObject($id);
        $name = $obj['ObjectName'];
		if( $name == 'stat' ) $name = 'cmnd';  // Sonoff Status in Command umwandeln
        $path = $name."/".$path;
        $id = IPS_GetParent($id);
    } while ( $id > 0 );
	
	$path = substr( $path, 0, -1 );  // letztes '/' endfernen
    return $path;
}

?>

Im Skript wird im Topic-Pfad automatisch „stat“ durch „cmnd“ ersetzt, d.h. man muss die stat/POWER Variable mit dem Aktionsskript verknüpfen und nicht die cmnd/POWER Variable. Die Aktualisierung des Variablenwerts geschieht übrigens nicht durch das Aktionsskript selbst, sondern erst durch den MQTT Handler, wenn das Sonoff den neuen Status zurückgemeldet hat.

Damit erst einmal viel Erfolg, falls jemand einen ähnlichen Einsatzzweck mit Symcon und MQTT hat. Hier von meiner Seite auch noch meine dringende Bitte an das Symcon Entwicklerteam, MQTT in Symcon aufzunehmen, idealerweise mit Symcon als Broker.

Hallo dheiss,

ich habe am Wochenende angefangen ein Modul zu schreiben, mit dem man die Sonoff Geräte einbinden kann. :smiley:
Ich denke heute oder morgen gibt es dazu noch die erste Beta Version. :slight_smile:

Grüße,
Kai

Funktioniert :D.

Werte eintragen:

und schalten :). Beziehungsweise wenn der Sonoff anderweitig geschaltet wird ändert sich die Variable auch in IP-Symcon

Danke für die Arbeit.

Hallo,

welche ID muss den als „MQTT_Subscribe“ im Skript „MQTT Handler“ eingetragen werden?

Gruß Tobias