MQTT Anbindung / oder externe Daten per Push in Symcon bekommen

Hallo zusammen,

danke an PaulG4H für den Hinweis mit dem Modul MQTTBroker!!!
Das Subscriben funktioniert auf Anhieb, das ist ne tolle Arbeit! Auch wenn das Pulishen noch nicht geht. Dafür nehm ich derzeit noch mein altes Modul GitHub - mkretzschmar/SymconMQTT: MQTT Client as PHP Module for IP-Symcon
Ist aber auch nur rudimentär implementiert, publizieren funktioniert aber ganz gut. Vielleicht könnte man auch beide zusammenführen?..
Für den Empfang hatte ich bisher immer Eclipse Kura auf dem PI verwendet (mit einem eigenen Java OSGi Plugin zur Kommunikation mit IPS per JSON-PRC).

Marek

Hallo marekre,

Ich habe nun mqtt in beide Richtungen Implementiert. Es läuft neben dem mosquitto MQTT Broker noch mqttwarn welches per json RPC alle topics eines bestimmten Start Ordners an IPS überträgt und dort Automatisch die Struktur mit den Kategorien und Variablen anlegt, boolean werden auch so angelegt das diese gleich bedienbar sind und über die MQTT_Publish Funktion in den Broker zurückschreiben…

Also aus IPS zu MQTT Broker Veröffentlichen mit dem Modul GitHub - mkretzschmar/SymconMQTT: MQTT Client as PHP Module for IP-Symcon

Und Abbonieren über den Dienst mqttwarn und json RPC nach IPS.

Ich werde in den nächsten Tagen meine IPS Installation von RPI2 Wheezy auf einem RPI3 mit Jessie neu machen und wenn gewünscht eine Doku darüber veröffentlichen?

Hallo Paul,

das hört sich interessant an.
Hast du hierzu noch eine Doku erstellt?

Schöne Grüße
Ansgar

Hallo,

danke für die Eure Arbeit.
Habe nun diesen Weg für mich gefunden, um Sensoren per MQTT abzufragen.
Funktioniert!

raspberryPi3 mit mosquitto, mqttwarn und symcon.
+Scripts von Seite 2
:smiley:

Hoffentlich hat Symcon bald ein Erbarmen und führt dies native in das System ein.

Gruß Andreas

Hi könnte einer mal bitte eine Anleitung schreiben, wie man nun MQTT Daten empfangen und senden kann mit IPS… ich blicke nicht mehr durch was wie wo mit welchen Modul / Script nun geht…

Gibt es hierzu Neuigkeiten? Ich habe ja noch immer die Hoffnung, dass MQTT direkt von IPS unterstützt wird…

Gruss Daniel

Sorry bis heute haben wir nichts von Symcon Maker dazu gehört, das es kommen wird :mad:

Publisher ist ja hier:
neues Modul MQTTPUB für IPS ab 4.1
Anderen Weg… keine Ahnung :wink:
Michael

Danke Nall Chan aber das ist nur eine Richtung oder?

Ich will ja nicht nur schreiben sondern auch Lesen, aber alles was es dafür gibt ist von der comunity, der Hersteller hat scheinbar kein bedürfniss mqtt zu integrieren weil IoT für die wie es aussieht noch „Neuland“ ist…

Ich habe es so gelöst:

http://www.lxccu.com/manuals:symcon:mqtt-integration#symcon

Gibt es nun eigentlich zu IPS und MQTT irgendwelche Neuigkeiten? Ich versuche ja aus den ganze Scripts hier schlau zu werden, aber leider ohne Erfolg.
Ich habe ein ESPEasy Modul am Laufen, welches Daten an einen Mosquitto Broker sendet. Das funktioniert super und ich kann auf den Broker auch mit MQTT.fx zugreifen und mir alles anschauen. Lediglich bei der IPS Integration scheitere ich. Da gibts ja nun etliche Module und Scripts, aber ehrlich gesagt habe ich keines davon zum Laufen gebracht. Bei kaum einem ist eine Anleitung dabei.
In IPS habe ich jetzt einen IPS Publisher als I/O Instanz gefunden, der aber offensichtlich nur Daten an den Broker senden kann. Gibt es überhaupt eine „einfache“ Möglichkeit, dass ich mir eine Variable anlege und die mit Daten, die vom Broker abgeholt werden updaten lasse?
Warum wird MQTT so stiefmütterlich von IPS gehandhabt?

Hi,

also ich empfange und sende Daten via Thomas MQTT Implementierung.
https://github.com/thomasf68/IPS_MQTT
Einfach das Modul laden, eine Instanz erstellen und dann mit MQTT-Publish() senden und innerhalb eines „Handle“-script empfangen.
Klappt bei mir soweit recht zuverlässig!

Ok. ICh hab das Modul installiert. Die Verbindung zum Client Socket (brokerIP:1883) hergstellt und das Beispiel Handle Script mit angepasster ModulID verwendet. Allerdings passiert nix. Im Beispielscript werden ja auch Variablen angelegt. Die MQTT Nachrichten kommen zum Beispiel auf Energie/Gas/Pulse am Broker an. Wo muss ich ihm mitteilen welche Nachrichten er abbonieren soll? Das ist da momentane Handle Script welches ich verwende.

<?


    //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 = $topic[$last];

            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){
                                    $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']. "' enthält keine Typinfo");		
            }

    }

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


?>

Hallo Thomas,

wie sehen Deine Topics aus (vollständiger Pfad)? Wenn Du Dir unsicher über den Eingang bist, baue mal ein

//var_dump($topic);

in Dein Script ein.
Bei meinen Topics (bei mir in $topic[1]) kommen Strings an. Der interessante Wert (bei mir Temperaturen oder Anzahl der Sensoren) steht in Message (da wäre dann erst mal ein echo gut). Im Case-Zweig verzweige ich also nach $topic[1] und behandle dann den int/float-Wert.

Grüße, Gerhard

Aktueller Stand.
Das oben aufgeführte Script wird bei mir nach kurzer Zeit als fehlerhaft markiert und scheint dann gar nicht mehr ausgeführt zu werden. Ich habe lediglich die Log Meldung oben aktiviert indem ich die Kommentarzeichen entfernt habe.

Die Verbindung zum MQTT Broker über den MQTT Client und den zugehörigen Socket steht auch, Scheint aber komischerweise immer abzubrechen, wenn das Script ausgeführt wird.

Socket.JPG

Und so schauen die Meldungen vom MQTTClient aus, die er im debug ausgibt.

Hallo Thomas,

mußte gerade feststellen, dass das Modul von Thomas zur Zeit bei mir nicht arbeitet, statt dessen beim ersten Start einen Fehler produziert und dann nichts mehr tut.
Wenn ich da weiter bin, melde ich mich wieder.

Welche IPS-Version hast Du?

Grüße, Gerhard

Ich update regelmäßig auf die neuste Version, also aktuell die 4.4.

Hallo Thomas,

es gibt in Deinem Script auch noch eine Passage zum Connect:


if($_IPS['SENDER']=='MQTT_CONNECT')
{
	$topic = "myTOPIC/#";
	//echo "connect
";
	MQTT_Subscribe($dieses_script_id, $topic, 0);
}

Mit dem echo kannst Du im Meldungsfenser sehen, ob die Verdindung zustande gekommen ist. Und Dein ‚myTOPIC‘ muss in den Debugfenstern von Client und Splitter auftauchen - bei Dir sehe ich da noch nichts.

Grüße, Gerhard
ps: wer sendet die topics? In welcher Form?

Hallo Thomas,

mein MQTT läuft wieder - jetzt habe ich etwas mehr Zeit. Zuerst mal Allgemeines: Bei MQTT gibt es 3 Teile,

  • einen (oder mehr) Publisher, der die Daten in der Form ‚/Topic/Message‘ dem Broker bereit stellt
  • einen Broker, der Daten von den Publishern bekommt und an Subscriber verteilt
  • einen (oder mehr) Subscriber, der beim Broker ‚Topics‘ abonniert

Dein Publisher liefert also ‚Energie/Gas/Pulse‘. Die Message dabei sind wolhl die Pulse, der Rest sind die Topics. Dein Subscriber muss sich also für diesen Pfad beim Broker-connect anmelden:


if($_IPS['SENDER']=='MQTT_CONNECT')
{
	$topic = "Energie/#";
	//echo "connect
";
	MQTT_Subscribe($dieses_script_id, $topic, 0);
}

Nach dem connect werden die Daten abgefragt:


if($_IPS['SENDER']=='MQTT_GET_PAYLOAD')
{
   $topic = $_IPS['TOPIC'];  // die topics: Energie/Gas    
      //echo $topic."
";
   $topic_parts = explode('/', $topic);
   $msg = $_IPS['MSG'];    // Pulse
      //var_dump($topic_parts);

   if($topic_parts[0] == "Energie")
   {
      switch($topic_parts[1])
      {
         case "Gas":            // Unter-Topic Gas
         {
	     SetValueInteger($deine_pulse_id, $msg);
             break;
	}
	case "Strom":		// Unter-Topc Strom etc
	{
	     ....
	}
	default: break;
     }
  }
}

Ich hoffe, es ist nun etwas verständlicher geworden. In den Debug-Informationen müssen Topics und Message auftauchen:
client.JPG

Grüße, Gerhard

Hallo Gerhard

Danke für diene Ausführungen. zunächst habe ich einen fehler bei mir gefunden. Im MQTT_Subscribe die falsche ID drin. Ich hatte die ID der MQTT Client Instanz und nicht die meines Scripts. Die Verbindung zum Broker steht zumindest laut den Debug-Meldungen im MQTT Client. Doet steht
„Connected to broker ok“
Beim broker komen auch meldungen vom Publischer (ESP8266 mit ESPEasy) an (siehe Bild vom MQTTfx Programm).

Irgendwie scheint aber das Subscribe nicht zu funktionieren. Er Empfängt zwar was, aber die Datenblöcke sind komplett leer.
Data arrived:{„DataID“:"{018EF6B5-AB94-40C6-AA53-46943E824ACF}",„Buffer“:„Ð\u0000“}

Mein Script schaut jetzt so aus.

<?
$dieses_script_id =16881;
$gas_pulse_id     =29951;
$strom_pulse_id   =10049;
 

    IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],print_r($_IPS,true));


if($_IPS['SENDER']=='MQTT_GET_PAYLOAD')
{
   $topic = $_IPS['TOPIC'];  // die topics: Energie/Gas    
      echo $topic."
";
   $topic_parts = explode('/', $topic);
   $msg = $_IPS['MSG'];    // Pulse
      var_dump($topic_parts);

   if($topic_parts[0] == "Energie")
   {
      switch($topic_parts[1])
      {
         case "Gas":            // Unter-Topic Gas
         {
         SetValueInteger($gas_pulse_id, $msg);
             break;
    }
	    case "Strom":        // Unter-Topc Strom etc
	    {
         SetValueInteger($strom_pulse_id, $msg);
             break;
	         
	    }
    default: break;
     }
  }
}  

/*    if($_IPS['SENDER']=='MQTT_GET_PAYLOAD'){

            $msg = $_IPS['MSG'];
            $topic = explode("/", $_IPS['TOPIC']);

            IPS_LogMessage(IPS_GetName($_IPS['SELF'])." ".$_IPS['SELF'],$topic);

            $id_parent = 0;
            $last = count($topic)-1;
            $type = $topic[$last];

            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){
                                    $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']. "' enthält keine Typinfo");		
            }

    }
*/
    if($_IPS['SENDER']=='MQTT_CONNECT') 
    {
    $topic = "Energie/#";
    echo "connect
";
    MQTT_Subscribe($dieses_script_id, $topic, 0);
    }  
	

?>

Bei dir steht da was drin.