Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Letzte ÜberarbeitungBeide Seiten der Revision
manuals:symcon:mqtt-integration [2017/08/04 17:16] paulg4hmanuals:symcon:mqtt-integration [2018/09/22 18:52] admin
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 8: Zeile 13:
 **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>
 +
  
 ===== Grund Installation am PI Einrichten ===== ===== Grund Installation am PI Einrichten =====
Zeile 35: Zeile 41:
  
 ===== Pakete Installieren ===== ===== Pakete Installieren =====
- +Einen MQTT Broker z.B. das Paket mosquitto Installieren 
-==== Mosquitto (MQTT Broker) ==== +  aptitude install mosquitto mosquitto_pub mosquitto_sub
-  aptitude install mosquitto -y+
      
-==== mqttwarn (mqtt daemon der alle Ereignisse zu Symcon weiterleitet) ==== +====Symcon Vorbereiten =====
-[[https://github.com/jpmens/mqttwarn/wiki/Setup|Installation aus der Wiki von hier]] +
-Abhängige Pakete Installieren: +
-  pip install paho-mqtt +
-Verzeichniss erstellen +
-  cd /opt/ +
-Herunterladen mit: +
-  git clone https://github.com/jpmens/mqttwarn.git +
-  cd mqttwarn +
-  chmod +x mqttwarn.py +
-  cp mqttwarn.ini.sample mqttwarn.ini +
-Derinhalt der mqttwarn.ini sollte so aussehen: +
-<code># -*- coding: utf-8 -*- +
-# mqttwarn example configuration file "mqttwarn.ini"+
  
-[defaults] +==== MQTT Client zum Senden in Symcon Installieren ==== 
-hostname     'localhost'  ; default +Zum Senden von Daten per MQTT_Publish aus jedem script: 
-port         1883 +  https://github.com/mkretzschmar/SymconMQTT
-username     None +
-password     None +
-clientid     'mqttwarn' +
-lwt          'clients/mqttwarn' +
-skipretained False +
-cleansession = True+
  
-protocol     = 3 
  
-; logging +==== Mosquitto an Symcon Anbinden ====
-logformat '%(asctime)-15s %(levelname)-5s [%(module)s] %(message)s' +
-logfile   '/var/log/mqttwarn.log'+
  
-; one of: CRITICAL, DEBUG, ERROR, INFO, WARN +Eine Kategorie anlegen  
-loglevel  = DEBUG +  Datenpunkte/MQTT/devices 
-#loglevel  = ERROR+   
 +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.
  
-; path to file containing self-defined functions for formatmap and datamap +Die Datei: 
-; omit the '.py' extension +  Datenpunkte/MQTT/mqtt_switch_relais"
-functions = 'samplefuncs'+
  
-name the service providers you will be using+mit folgendem Inhalt: 
-launch    filelog, http+<code php><? 
 + $d = false$msg = ""; 
 + $value = ""; $run = true; 
 + if ($d){ $msg .= "Sender: ".$_IPS['SENDER']."\n";
 + //if (($_IPS['SENDER'] == "Variable") or ($_IPS['SENDER'] == "WebFront")){ 
 + if ($_IPS['SENDER'] == "Variable"){ 
 +    $value GetValue($_IPS['VARIABLE']); 
 +    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 ($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
  
-[config:file] +    break; 
-append_newline = True + case 2: //float
-targets = { +
-    'f01'       ['/tmp/f.01'], +
-    'log-me'    : ['/tmp/log.me'], +
-    'mqttwarn'  : ['/tmp/mqttwarn.err'], +
-    }+
  
-[config:log] +    break; 
-targets = { + case 3//string
-    'debug'  [ 'debug' ], +
-    'info'   : [ 'info' ], +
-    'warn'   : [ 'warn' ], +
-    'crit'   : [ 'crit' ], +
-    'error'  : [ 'error'+
-  }+
  
-[config:http] +    break; 
-timeout = 60 +   } 
-targets = { +   if($d)$msg ."veröffentliche: ".$value."\n"
-                #method     #URL               # query params or None          # list auth +   MQTT_Publish(50729 /*[MQTT_Localhost]*/, $topic ,$value ,1 , true); 
-  'get1'    : [ "get",  "http://example.org?", { 'q''{name}', 'isod' : '{_dtiso}', 'xx': 'yy' }, ('username', 'password') ], + }
-  'post1'    : [ "post""http://example.net", { 'q': '{name}', 'isod' : '{_dtiso}', 'xx': 'yy' }, None ], +
-  'postIPSORIGINAL'    : "post", "http://<symcon ip>:3777/api/"None('username''passwd'], +
-  'postIPS'    : [ "post", "http://<symcon ip>:3777/api/", None , None, True ] +
-  }+
  
-special config for 'failover' events +  if ($d){ $msg .= "Variable: ".IPS_GetName($id)."\nTopic: ".$topic."\n Value: ".$value."\n"} 
-[failover] +   
-targets = log:errorfile:mqttwarn+   if(strlen($msg) > 0){ 
 +  IPS_LogMessage("mqtt_switch_relais"$msg); 
 +  }
  
-[devices/#+?>
-targets = http:postIPS +
-template = ipsrpc.json+
 </code> </code>
  
-<WRAP center round info 100%> 
-der letzte Abschnitt [devices/#] bedeutet das alle daten im MQTT Broker (mosquitto) unter devices/* an IPS übergeben werden! 
-</WRAP> 
  
 +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:
  
-dann noch das template +<code php> <? 
-  cd /opt/mqttwarn/templates +$d = true; $msg = "";
-in form der Datei  +
-  vi ipsrpc.json  +
-mit folgendem Inhalt erstellen: +
-<code>{% +
-    set data = { +
-        'method': "IPS_RunScriptEx", +
-        'params': [<id des verarbeitungs scriptes>, { 'payload': topic +";" + payload } ], +
-        'jsonrpc': "2.0", +
-        'id': '0' +
-    } +
-%} +
-{{ data | jsonify }}</code> +
- +
-=== Supervisor === +
-Damit mqttwarn als Dienst ausgeführt wird verwende ich supervisor wie [[http://jpmens.net/2014/02/13/in-my-toolbox-supervisord/|hier]] Beschrieben. +
-  aptitude install supervisor +
-in dem Ornder +
-  cd /etc/supervisor/conf.d +
-die Datei mqttwarn.conf anlegen +
-  vi mqttwarn.conf +
-mit folgendem Inhalt +
-<code>[program:mqttwarn] +
-directory = /opt/mqttwarn +
-command = /opt/mqttwarn/mqttwarn.py +
-user = root +
-environment= MQTTWARNINI="/opt/mqttwarn/mqttwarn.ini"</code> +
- +
-Nun kann mqttwarn gestartet werden mit: +
-  service supervisor start +
-und z.B. in einem zweiten Terminal Fenster die Log Datei beobachtet werden: +
-  tail -f /var/log/mqttwarn.log +
-was so aussehen sollte: +
-<code>2016-11-30 21:26:19,678 DEBUG [mqttwarn] Attempting connection to MQTT broker localhost:1883... +
-2016-11-30 21:26:19,678 DEBUG [mqttwarn] Setting LWT to clients/mqttwarn... +
-2016-11-30 21:26:19,682 INFO  [mqttwarn] Starting 1 worker threads +
-2016-11-30 21:26:19,683 DEBUG [mqttwarn] Job queue has 0 items to process +
-2016-11-30 21:26:19,684 DEBUG [mqttwarn] Connected to MQTT broker, subscribing to topics... +
-2016-11-30 21:26:19,685 DEBUG [mqttwarn] Subscribing to devices/# (qos=0)</code> +
- +
-===== Symcon ===== +
-Nach der Installation von IPS dort in einer Kategorie z.b. Datenpunlte/MQTT/ ein neues Script mit folgendem Inhalt anlegen: +
-<code php><? +
-$d = false; $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 /*[Archive]*/; 
-$relaisScriptId = <id des Relais scripts> /*[Datenpunkte\MQTT\mqtt_switch_relais]*/; //Relais Script ID +$relaisScriptId = 17676 /*[Datenpunkte\MQTT\mqtt_switch_relais]*/; //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)
 + $payload = $_IPS['payload'];
  
-if(count($varsplit)>1){ 
- $topics = explode("/", $varsplit[0]); 
- $topic=$varsplit[0]; 
- $payload=$varsplit[1]; 
  $payload = str_replace(array("\r", "\n"), '', $payload);  $payload = str_replace(array("\r", "\n"), '', $payload);
  
Zeile 209: Zeile 155:
  for($i = 0; $i < count($topics); $i++){  for($i = 0; $i < count($topics); $i++){
  if ($i == (count($topics) -1)){  if ($i == (count($topics) -1)){
-         $type = 2;+  $type = 2;
  } else {  } else {
  $type = 0;  $type = 0;
Zeile 221: Zeile 167:
  }  }
   
- //IPS_SetIdent($idf, "mqtt;".$topic); 
  IPS_SetIdent($idf, "mqtt_".str_replace("/", "_", $topic));  IPS_SetIdent($idf, "mqtt_".str_replace("/", "_", $topic));
   
- //Wert Setzen 
  mqset($idf, $payload);  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 243: Zeile 185:
  
 function mqset($id, $value){ function mqset($id, $value){
- switch(IPS_GetVariable($id)["VariableType"]){ + if(GetValue($id) != $value){ 
- case 0: // boolean + switch(IPS_GetVariable($id)["VariableType"]){ 
- $val = filter_var($value, FILTER_VALIDATE_BOOLEAN); + case 0: // boolean 
- SetValue($id, $val); + $val = filter_var($value, FILTER_VALIDATE_BOOLEAN); 
- break; + SetValue($id, $val); 
- case 1: // integer + break; 
- $val = intval($value); + case 1: // integer 
- SetValue($id, $val); + $val = intval($value); 
- break; + SetValue($id, $val); 
- case 2: //  float + break; 
- $val = floatval($value); + case 2: //  float 
- SetValue($id, $val); + $val = floatval($value); 
- break; + SetValue($id, $val); 
- case 3: // string + break; 
- SetValue($id, $value); + case 3: // string 
- break;+ SetValue($id, $value); 
 + break; 
 + }
  }  }
 } }
Zeile 351: Zeile 295:
 } }
 ?></code> ?></code>
 +==== Mosquitto (MQTT Broker) ====
 +  aptitude install mosquitto mosquitto-clients python-pip git -y
 +  
 +==== mqttwarn (mqtt daemon der alle Ereignisse zu Symcon weiterleitet) ====
 +[[https://github.com/jpmens/mqttwarn/wiki/Setup|Installation aus der Wiki von hier]]
 +Abhängige Pakete Installieren:
 +  pip install paho-mqtt jinja2
 +Verzeichniss erstellen
 +  cd /opt/
 +Herunterladen mit:
 +  git clone https://github.com/jpmens/mqttwarn.git
 +  cd mqttwarn
 +  chmod +x mqttwarn.py
 +  cp mqttwarn.ini.sample mqttwarn.ini
 +Derinhalt der mqttwarn.ini sollte so aussehen:
 +<code># -*- coding: utf-8 -*-
 +# mqttwarn example configuration file "mqttwarn.ini"
  
-hier noch 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.+[defaults] 
 +hostname     = 'localhost'  ; default 
 +port         = 1883 
 +username     = None 
 +password     = None 
 +clientid     = 'mqttwarn' 
 +lwt          = 'clients/mqttwarn' 
 +skipretained = False 
 +cleansession = True
  
-<code php><? +protocol     = 3
- $d false; $msg = ""; +
- $value = ""; $run = true; +
- if ($d){ $msg .= "Sender: ".$_IPS['SENDER']."\n";+
- //if (($_IPS['SENDER'] == "Variable") or ($_IPS['SENDER'] == "WebFront")){ +
- if ($_IPS['SENDER'] == "Variable"){ +
-    $value = GetValue($_IPS['VARIABLE']); +
-    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 ($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+logging 
- case 2: //float+logformat = '%(asctime)-15s %(levelname)-5s [%(module)s] %(message)s' 
 +logfile   = '/var/log/mqttwarn.log'
  
-    break; +one ofCRITICAL, DEBUG, ERROR, INFO, WARN 
- case 3//string+loglevel  = DEBUG 
 +#loglevel  = ERROR
  
-    break+path to file containing self-defined functions for formatmap and datamap 
-   } +; omit the '.py' extension 
-   if($d){ $msg ."veröffentliche: ".$value."\n";+functions 'samplefuncs'
- MQTT_Publish(50729 /*[MQTT_Localhost]*/, $topic ,$value ,1 , true); +
- }+
  
-  if ($d)$msg .= "Variable: ".IPS_GetName($id)."\nTopic: ".$topic."\n Value: ".$value."\n"+; name the service providers you will be using. 
-   +launch    = file, log, http 
-   if(strlen($msg) > 0)+ 
-  IPS_LogMessage("mqtt_switch_relais", $msg); +[config:file] 
-  }+append_newline = True 
 +targets = { 
 +    'f01'       : ['/tmp/f.01'], 
 +    'log-me'    : ['/tmp/log.me'], 
 +    'mqttwarn'  : ['/tmp/mqttwarn.err'], 
 +    } 
 + 
 +[config:log] 
 +targets 
 +    'debug'  [ 'debug' ], 
 +    'info'   : [ 'info' ], 
 +    'warn'   : [ 'warn' ], 
 +    'crit'   : [ 'crit' ], 
 +    'error'  : [ 'error'
 +  } 
 + 
 +[config:http] 
 +timeout = 60 
 +targets = { 
 +                #method     #URL               # query params or None          # list auth 
 +  'get1'    : [ "get",  "http://example.org?", { 'q': '{name}', 'isod' : '{_dtiso}', 'xx': 'yy' }, ('username', 'password'], 
 +  'post1'    : [ "post", "http://example.net", { 'q''{name}', 'isod' : '{_dtiso}', 'xx': 'yy' }, None ], 
 +  'postIPSORIGINAL'    : [ "post", "http://<symcon ip>:3777/api/", None, ('username', 'passwd') ], 
 +  'postIPS'    : [ "post", "http://<symcon ip>:3777/api/", None , None, True ] 
 +  
 + 
 +; special config for 'failover' events 
 +[failover] 
 +targets = log:error, file:mqttwarn 
 + 
 +[devices/#
 +targets = log:info, http:postIPS 
 +template = ipsrpc.json 
 +</code> 
 + 
 +<WRAP center round info 100%> 
 +der letzte Abschnitt [devices/#] bedeutet das alle daten im MQTT Broker (mosquittounter devices/* an IPS übergeben werden! 
 +</WRAP> 
 + 
 + 
 +dann noch das template 
 +  cd /opt/mqttwarn/templates 
 +in form der Datei  
 +  vi ipsrpc.json  
 +mit folgendem Inhalt erstellen: 
 +<code>{% set data = 
 +                'method': "IPS_RunScriptEx", 
 +                'params': [33107, { 'topic': topic, 'payload': payload ], 
 +                'jsonrpc': "2.0", 
 +                'id': '0' 
 +        } 
 +%} 
 +{{ data | jsonify }}</code> 
 + 
 +=== Supervisor === 
 +Damit mqttwarn als Dienst ausgeführt wird verwende ich supervisor wie [[http://jpmens.net/2014/02/13/in-my-toolbox-supervisord/|hier]] Beschrieben. 
 +  aptitude install supervisor 
 +in dem Ornder 
 +  cd /etc/supervisor/conf.d 
 +die Datei mqttwarn.conf anlegen 
 +  vi mqttwarn.conf 
 +mit folgendem Inhalt 
 +<code>[program:mqttwarn] 
 +directory = /opt/mqttwarn 
 +command = /opt/mqttwarn/mqttwarn.py 
 +user = root 
 +environment= MQTTWARNINI="/opt/mqttwarn/mqttwarn.ini"</code> 
 + 
 +Nun kann mqttwarn gestartet werden mit: 
 +  service supervisor start 
 +und z.B. in einem zweiten Terminal Fenster die Log Datei beobachtet werden: 
 +  tail -f /var/log/mqttwarn.log 
 +was so aussehen sollte: 
 +<code>2016-11-30 21:26:19,678 DEBUG [mqttwarn] Attempting connection to MQTT broker localhost:1883... 
 +2016-11-30 21:26:19,678 DEBUG [mqttwarn] Setting LWT to clients/mqttwarn... 
 +2016-11-30 21:26:19,682 INFO  [mqttwarn] Starting 1 worker threads 
 +2016-11-30 21:26:19,683 DEBUG [mqttwarn] Job queue has 0 items to process 
 +2016-11-30 21:26:19,684 DEBUG [mqttwarn] Connected to MQTT broker, subscribing to topics... 
 +2016-11-30 21:26:19,685 DEBUG [mqttwarn] Subscribing to devices/# (qos=0)</code>
  
-?></code> 
  
Recent changes RSS feed Creative Commons License Donate Minima Template by Wikidesign Driven by DokuWiki