Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
manuals:symcon:mqtt-integration [2017/08/04 17:51] – [Symcon Vorbereiten] paulg4hmanuals:symcon:mqtt-integration [2018/09/23 19:15] (aktuell) paulg4h
Zeile 1: Zeile 1:
 ====== MQTT in Symcon Einbinden ====== ====== MQTT in Symcon Einbinden ======
 +
 +<WRAP center round info 60%>
 +Stand September 2018, IPS 4.4
 +</WRAP>
 +
  
 Diese Anleitung zeigt wie man auf einem Raspberry PI 3 das MQTT Protokoll über Mosquitto und mqttwarn in Symcon schreibend und per Modul auch Beschreibbar ist. Also in beide Richtungen Ereigniss Basierend kommuniziert so wie ich es schon seit einem halben Jahr Produktiv mit diversen Arduinos und ESP8266 (PubSub Library) einsetze. Diese Anleitung zeigt wie man auf einem Raspberry PI 3 das MQTT Protokoll über Mosquitto und mqttwarn in Symcon schreibend und per Modul auch Beschreibbar ist. Also in beide Richtungen Ereigniss Basierend kommuniziert so wie ich es schon seit einem halben Jahr Produktiv mit diversen Arduinos und ESP8266 (PubSub Library) einsetze.
Zeile 7: Zeile 12:
  
 **Auch müssen alle Werte in <spitzen> Klammern durch die Eigenen ersetzt werden!** **Auch müssen alle Werte in <spitzen> Klammern durch die Eigenen ersetzt werden!**
-</WRAP> 
- 
-<WRAP center round info 90%> 
-Nachdem Symcon ja Debian auf x86 Hardware nicht Unterstütz (werd ich nie verstehen) sondern nur Ubuntu und da die jetzt schon sehr alte 14.04er habe ich soeben ein paar Ergänzungen in der Anleitung gemacht und die MQTT integration nun auch auf Ubuntu Installiert (Stand Jänner 2017) 
 </WRAP> </WRAP>
  
Zeile 40: Zeile 41:
  
 ===== Pakete Installieren ===== ===== Pakete Installieren =====
 +Einen MQTT Broker z.B. das Paket mosquitto Installieren 
 +  aptitude install mosquitto mosquitto_pub mosquitto_sub 
 +  
 ===== Symcon Vorbereiten ===== ===== Symcon Vorbereiten =====
-Nach der Installation von IPS dort in die Kategorie anlegen + 
 +==== MQTT Client zum Senden in Symcon Installieren ==== 
 +Zum Senden von Daten per MQTT_Publish aus jedem script: 
 +  https://github.com/mkretzschmar/SymconMQTT 
 + 
 + 
 +==== Mosquitto an Symcon Anbinden ==== 
 + 
 +Eine Kategorie anlegen 
   Datenpunkte/MQTT/devices   Datenpunkte/MQTT/devices
-hier das switch Script damit sind "boolean" Datenpunkte (einfach "True" oder "False" beim ersten schreiben in dem mqtt broker erstellt die Variable in Symcon und verlinkt diese mit dem Script und ist somit sofort Bedienbar.+   
 +In diesem Knoten werden dann alle Geräte und Datenpunkte Automatisch erstellt / Aktualisiert, nun gehen wir aber wieder zu  
 +  Datenpunkte/MQTT 
 +und erstellen das Script "mqtt_switch_relais", damit sind "boolean" Datenpunkte (einfach "True" oder "False" beim ersten schreiben in dem mqtt broker erstellt die Variable in Symcon und verlinkt diese mit dem Script und ist somit sofort Bedienbar.
  
-Ich lege es nach:+Die Datei:
   Datenpunkte/MQTT/mqtt_switch_relais"   Datenpunkte/MQTT/mqtt_switch_relais"
  
 +mit folgendem Inhalt:
 <code php><? <code php><?
- $d = false; $msg = "";+ include_once(IPS_GetScript(42011 )["ScriptFile"]); 
 +  
 + $d = true; $msg = "";
  $value = ""; $run = true;  $value = ""; $run = true;
- if ($d){ $msg .= "Sender: ".$_IPS['SENDER']."\n"; } +  
- //if (($_IPS['SENDER'== "Variable") or ($_IPS['SENDER'] == "WebFront")){ + if ($d){ 
- if ($_IPS['SENDER'] == "Variable"){ + $msg .= "Sender: ".$_IPS['SENDER']."\n"; 
-    $value = GetValue($_IPS['VARIABLE']); + $msg .print_r($_IPS, true);
-    if ($value == $_IPS['OLDVALUE']){ +
-       $msg .= "Value: X".$value."X old: X".$_IPS['OLDVALUE']."X\n"; +
-       $run = false; +
-    }+
  }  }
- if (($_IPS['SENDER'] == "WebFront")){ +  
-    $value = $_IPS['VALUE'];+ if ($_IPS['SENDER'] == "Execute"){ 
 + //On Manual Execute check child events and set Event Trigger to "On Change" 
 + foreach (IPS_GetChildrenIDs($_IPS['SELF']) as $key => $value){ 
 + if (IPS_GetObject($value)['ObjectType'] == 4){ 
 + IPS_SetEventTrigger($value, 1, IPS_GetEvent($value)['TriggerVariableID']); 
 +
 +
 + } else { 
 + if (($_IPS['SENDER'] == "WebFront") or ($_IPS['SENDER'] == "Variable")){ 
 + if ($_IPS['SENDER'] == "Variable"){ 
 + //$value = (GetValueBoolean($_IPS['VARIABLE'])?"true":"false"); 
 + $value = ($_IPS['VALUE']=="1"?"true":"false"); 
 +
 + if (($_IPS['SENDER'] == "WebFront")){ 
 + $value = ($_IPS['VALUE']=="1"?"true":"false"); 
 +
 +  
 + if (($value == (GetValueBoolean($_IPS['VARIABLE'])?"true":"false")) and ($_IPS['SENDER'] != "Variable")){ 
 + if($d){ $msg .= "  Aktuell: >".$value."< alt: >".(GetValueBoolean($_IPS['VARIABLE'])?"true":"false")."<\n";
 + $run = false; 
 +
 +  
 + if ($d){  
 + $msg .= "  run: ".($run?"Ja":"Nein")."\n"; 
 +
 +  
 + $topic = explode(";",IPS_GetObject($_IPS['VARIABLE'])['ObjectInfo'])[1]; 
 +  
 + if((strlen($topic) > 3) and ($run)){ 
 + if ($d){ 
 + $msg .= "  Veröffentliche: ".$value."\n";  
 + $msg .= "    Variable: ".IPS_GetName($_IPS['VARIABLE'])."\n"; 
 + $msg .= "    Topic: ".$topic."\n"; 
 + $msg .= "    Value: ".$value."\n"; 
 +
 + MQTT_Publish($idMQTTBroker , $topic ,$value ,1 , true); 
 +
 + }
  }  }
- if ($d){ $msg .= "Value: ".$value."\n"; } 
- $id = $_IPS['VARIABLE']; 
- $topic = explode(";",IPS_GetObject($id)['ObjectInfo'])[1]; 
- if((strlen($topic) > 3) and ($run)){ 
- switch(IPS_GetVariable($id)['VariableType']){ 
-    case 0: //boolean 
-       if($value == 1){ $value = "true"; } else { $value = "false"; } 
-       break; 
- case 1: //Integer 
- 
-    break; 
- case 2: //float 
- 
-    break; 
- case 3: //string 
- 
-    break; 
- } 
- if($d){ $msg .= "veröffentliche: ".$value."\n"; } 
- MQTT_Publish(50729 /*[MQTT_Localhost]*/, $topic ,$value ,1 , true); 
- } 
- 
-  if ($d){ $msg .= "Variable: ".IPS_GetName($id)."\nTopic: ".$topic."\n Value: ".$value."\n"; } 
-   
    if(strlen($msg) > 0){    if(strlen($msg) > 0){
   IPS_LogMessage("mqtt_switch_relais", $msg);   IPS_LogMessage("mqtt_switch_relais", $msg);
   }   }
  
-?> +?></code> 
-</code>+
  
 Das Eigentliche Script welces die Daten per RPC vom mqttwarn Daemon entgegennimmt und ablegt, in dem nicht Vergessen die ID's in den ersten Zeilen durch die Eigenen ersetzen: Das Eigentliche Script welces die Daten per RPC vom mqttwarn Daemon entgegennimmt und ablegt, in dem nicht Vergessen die ID's in den ersten Zeilen durch die Eigenen ersetzen:
  
-<code php><? +<code php> <? 
-$d = false; $msg = "";+$d = true; $msg = "";
 //sample value: devices/terminal/helligkeit;319 //sample value: devices/terminal/helligkeit;319
 // mqtt topic to symcon variable id mapping // mqtt topic to symcon variable id mapping
 $idParent = IPS_GetParent($_IPS['SELF']); $idParent = IPS_GetParent($_IPS['SELF']);
-$archiveId = <archiv id> /*[Archive]*/+$archiveId = 32289
-$relaisScriptId = <id des Relais scripts> /*[Datenpunkte\MQTT\mqtt_switch_relais]*/; //Relais Script ID +$relaisScriptId = 17676; //Relais Script ID
  
 // get value from mqtt variable // get value from mqtt variable
-$var = $_IPS['payload'];  +if( array_key_exists("payload", $_IPS)){ 
-$varsplit = explode(";", $var); + $topic = $_IPS['topic'];  
- + $topics = explode("/", $topic); 
-if(count($varsplit)>1){ + $payload = $_IPS['payload']; 
- $topics = explode("/", $varsplit[0]); +  
- $topic=$varsplit[0]; + $payload = str_replace(array("\r", "\n"), '', $payload); 
- $payload=$varsplit[1]; +  
- $payload = str_replace(array("\r", "\n"), '', $payload); + if ($d){ $msg .= "topic: $topic\npayload: $payload\n";
- +  
- if ($d){ $msg .= "topic: $topic\npayload: $payload\n";+ // Datentyp der payload herausfinden und ins Format für IPS Übersetzen 
- + $contType = 99; 
- // Datentyp der payload herausfinden und ins Format für IPS Übersetzen + if (is_float($payload+0)){ 
- $contType = 99; +   //Float 
- if (is_float($payload+0)){ + $contType = 2; 
-    //Float + } 
- $contType = 2; + if (($contType == 99) and (is_numeric($payload))){ 
-+   //Integer 
- if (($contType == 99) and (is_numeric($payload))){ + $contType = 1; 
-    //Integer + } 
- $contType = 1; + if (($contType == 99) and (is_string($payload))){ 
-+ if ((strtolower($payload) == "true") or (strtolower($payload) == "false")){ 
- if (($contType == 99) and (is_string($payload))){ +    //Boolean 
- if ((strtolower($payload) == "true") or (strtolower($payload) == "false")){ +  $contType = 0; 
-    //Boolean + } else { 
- $contType = 0; +    //String 
- } else { +  $contType = 3; 
-    //String + } 
- $contType = 3; + } 
- + $idf = $idParent; 
-+ //Pfad durchlaufen und Prüfen ob die Kategorien / Variablen vorhanden sind und bei bedarf Anlegen 
- $idf = $idParent; + for($i = 0; $i < count($topics); $i++){ 
- //Pfad durchlaufen und Prüfen ob die Kategorien / Variablen vorhanden sind und bei bedarf Anlegen + if ($i == (count($topics) -1)){ 
- for($i = 0; $i < count($topics); $i++){ +  $type = 2; 
- if ($i == (count($topics) -1)){ + } else { 
-         $type = 2; +  $type = 0; 
- } else { + } 
- $type = 0; + $idf = checkIfElementExists($idf, $type, $topics[$i], $contType); 
- + } 
- $idf = checkIfElementExists($idf, $type, $topics[$i], $contType); +  
-+ if($d){ 
-  +   $msg .= "Variablen Type. ".$contType."\n"; 
- if($d){ +   $msg .= "Set Itend to: "."mqtt_".str_replace("/", "_", $topic)."\n"; 
-    $msg .= "Variablen Type. ".$contType."\n"; + } 
-    $msg .= "Set Itend to: "."mqtt_".str_replace("/", "_", $topic)."\n"; +  
-+ IPS_SetIdent($idf, "mqtt_".str_replace("/", "_", $topic)); 
-  +  
- //IPS_SetIdent($idf, "mqtt;".$topic); + //mqset($idf, $payload); 
- IPS_SetIdent($idf, "mqtt_".str_replace("/", "_", $topic)); + SetValue($idf, $payload);
-  +
- //Wert Setzen +
- mqset($idf, $payload); +
- +
 } }
-if (strlen($msg) > 0){+if ((strlen($msg) > 0) and ($d)){
    if($_IPS['SENDER'] == "Execute"){    if($_IPS['SENDER'] == "Execute"){
       print $msg;       print $msg;
-else { + }  
- IPS_LogMessage("mqtt-read-run", $msg); + IPS_LogMessage("mqtt-read-run", $msg);
- }+
 } }
   
Zeile 175: Zeile 195:
  
 function mqset($id, $value){ function mqset($id, $value){
- switch(IPS_GetVariable($id)["VariableType"]){ + Global $msg, $d; 
- case 0: // boolean + if(GetValue($id) != $value){ 
- $val = filter_var($value, FILTER_VALIDATE_BOOLEAN); + switch(IPS_GetVariable($id)["VariableType"]){ 
- SetValue($id, $val); + case 0: // boolean 
- break; + $val = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); 
- case 1: // integer + if($d){ $msg .= "val: ".$val."\n";
- $val = intval($value); + SetValue($id, $val); 
- SetValue($id, $val); + break; 
- break; + case 1: // integer 
- case 2: //  float + $val = intval($value); 
- $val = floatval($value); + SetValue($id, $val); 
- SetValue($id, $val); + break; 
- break; + case 2: //  float 
- case 3: // string + $val = floatval($value); 
- SetValue($id, $value); + SetValue($id, $val); 
- break;+ break; 
 + case 3: // string 
 + SetValue($id, $value); 
 + break; 
 + }
  }  }
 } }
Zeile 220: Zeile 244:
  }  }
  IPS_SetName($id, $name);  IPS_SetName($id, $name);
-    IPS_SetParent($id, $varid); +  IPS_SetParent($id, $varid); 
-    if($type == 2){ // Variable +  if($type == 2){ // Variable 
-       if ($contType == 0){ // Boolean +   if ($contType == 0){ // Boolean 
-          if (strpos("   ".strtolower($name), "licht") > 0){ +    if (strpos("   ".strtolower($name), "licht") > 0){ 
-             //Wenn der Variablen Name das wort "licht" enthält das Profil Licht zuweisen +       //Wenn der Variablen Name das wort "licht" enthält das Profil Licht zuweisen 
-             IPS_SetVariableCustomProfile($id, "Licht"); +       IPS_SetVariableCustomProfile($id, "Licht"); 
-             IPS_SetVariableCustomAction($id, $relaisScriptId); +       IPS_SetVariableCustomAction($id, $relaisScriptId); 
- } elseif(strpos("   ".strtolower($name), "motion") > 0){ +    } elseif(strpos("   ".strtolower($name), "motion") > 0){ 
-    IPS_SetVariableCustomProfile($id, "Motion"); +       IPS_SetVariableCustomProfile($id, "Motion"); 
- } elseif ($name == "connected"){ +    } elseif ($name == "connected"){ 
-    IPS_SetVariableCustomProfile($id, "Connected"); +       IPS_SetVariableCustomProfile($id, "Connected"); 
-          } else { +    } else { 
- //Wenn es eine Boolean Variable ist das Profile ~Switch zuweisen +     //Wenn es eine Boolean Variable ist das Profile ~Switch zuweisen 
-           IPS_SetVariableCustomProfile($id, "~Switch"); +     IPS_SetVariableCustomProfile($id, "~Switch"); 
-           IPS_SetVariableCustomAction($id, $relaisScriptId); +     IPS_SetVariableCustomAction($id, $relaisScriptId); 
- checkCreateEvent($id, $relaisScriptId); +     checkCreateEvent($id, $relaisScriptId); 
- +    
- +   
-    if (strpos("   ".strtolower($name), "temp") > 0){ +   if (strpos("   ".strtolower($name), "temp") > 0){ 
-       IPS_SetVariableCustomProfile($id, "~Temperature"); +      IPS_SetVariableCustomProfile($id, "~Temperature"); 
-    +   
-    if (strpos("   ".strtolower($name), "humidity") > 0){ +   if (strpos("   ".strtolower($name), "humidity") > 0){ 
-       IPS_SetVariableCustomProfile($id, "~Humidity"); +      IPS_SetVariableCustomProfile($id, "~Humidity"); 
-    +   
-    if (strpos("   ".strtolower($name), "rssi") > 0){ +   if (strpos("   ".strtolower($name), "rssi") > 0){ 
-       IPS_SetVariableCustomProfile($id, "rssi"); +      IPS_SetVariableCustomProfile($id, "rssi"); 
-    }+   }
  IPS_SetInfo($id, "mqtt;$topic");  IPS_SetInfo($id, "mqtt;$topic");
  //Archivierung aktivieren  //Archivierung aktivieren
-       AC_SetLoggingStatus($archiveId, $id, true); +   AC_SetLoggingStatus($archiveId, $id, true); 
-    IPS_ApplyChanges($archiveId);+   IPS_ApplyChanges($archiveId);
  }  }
  
Zeile 275: Zeile 299:
  }  }
  if ($create){  if ($create){
-    //Event Anlegen +  //Event Anlegen 
-      $eid = IPS_CreateEvent(0);                   //Ausgelöstes Ereignis +  $eid = IPS_CreateEvent(0);                   //Ausgelöstes Ereignis 
- IPS_SetEventTrigger($eid, 0, $varid);        //Bei Änderung von Variable + IPS_SetEventTrigger($eid, 1, $varid);        //Bei Variablenaktualisierung 
- IPS_SetParent($eid, $scriptId);                 //Ereignis zuordnen+ IPS_SetParent($eid, $scriptId);              //Ereignis zuordnen
  IPS_SetEventActive($eid, true);              //Ereignis aktivieren  IPS_SetEventActive($eid, true);              //Ereignis aktivieren
  }  }
 } }
 ?></code> ?></code>
-==== Mosquitto (MQTT Broker) ==== + 
-  aptitude install mosquitto mosquitto-clients python-pip -y+==== MQTT Broker (Mosquitto) ==== 
 +  aptitude install mosquitto mosquitto-clients python-pip git -y
      
 ==== mqttwarn (mqtt daemon der alle Ereignisse zu Symcon weiterleitet) ==== ==== mqttwarn (mqtt daemon der alle Ereignisse zu Symcon weiterleitet) ====
Zeile 360: Zeile 385:
  
 [devices/#] [devices/#]
-targets = http:postIPS+targets = log:info, http:postIPS
 template = ipsrpc.json template = ipsrpc.json
 </code> </code>
Zeile 374: Zeile 399:
   vi ipsrpc.json    vi ipsrpc.json 
 mit folgendem Inhalt erstellen: mit folgendem Inhalt erstellen:
-<code>{% +<code>{% set data = { 
-    set data = { +                'method': "IPS_RunScriptEx", 
-        'method': "IPS_RunScriptEx", +                'params': [33107, { 'topic': topic, 'payload': payload } ], 
-        'params': [<id des verarbeitungs scriptes>, { 'payload': topic +";"payload } ], +                'jsonrpc': "2.0", 
-        'jsonrpc': "2.0", +                'id': '0' 
-        'id': '0' +        }
-    }+
 %} %}
 {{ data | jsonify }}</code> {{ data | jsonify }}</code>
Recent changes RSS feed Creative Commons License Donate Minima Template by Wikidesign Driven by DokuWiki