GPIO-LED fernsteuern - FHEM2FHEM vs ECMD vs MQTT

Begonnen von Pf@nne, 12 April 2015, 21:36:15

Vorheriges Thema - Nächstes Thema

Pf@nne

Moin,

für meine Hausautomatisierung möchte ich von einer Synology-FHEM-Instanz (A) eine LED auf einer anderen Raspberry-FHEM-Instanz (B) steuern. Auch soll der Status der LED (on / off) als Rückmeldung von B --> A zurück übertragen werden.

Es stellte sich jetzt die Frage ob dies besser mit FHEM2FHEM (im LOG-Mode) oder mit einer eigenen TCP-Verbindung über ECMD zu realisieren ist. Ich bin gerade dabei das für mich mal auszutesten und möchte den aktuellen Stand hier mal zusammenfassen.

Steuern einer entfernten LED über ECMD:

Zuerst müssen auf beiden Instanzen die entsprechenden TCP-Telnet-Server und die entsprechenden ECMD-Clients eingerichtet werden. Zur besseren Übersich nutze ich nicht den bereits vorhandenen Telnet-Server auf Port 7072.
Die besonderheit des ECMD-Clients ist die Definition der zu verwendenden Befehle in einem eigenen Config-File. Damit der ECMD-Config-File mit dem FHEM-Editor bearbeitet werden kann habe ich den File "ECMD_LED.cfg" im Instanzentsprechenden /FHEM Verzeichnis abgelegt:
z.B. "/volume1/@appstore/FHEM/share/fhem/FHEM/ECMD_LED.cfg" bei Synology-Instanz
bzw. "/opt/fhem/FHEM/ECMD_LED.cfg" bei der Raspberry-Instanz

Der Inhalt des Config-Files wird noch erläutert....um Fehlermeldungen zu vermeiden können die "ECMD-LED.cfg"-Files schon jetzt angelegt werden. Hierzu reicht es wenn im  Edit-Menü des WEB-IF die "myUtilsTemplate.pm" einfach unter dem Namen "ECMD-LED.cfg" gespeichert wird und der Inhalt gelöscht wird.

Steuernkanal von A-->B
TCP-Telnet-Server B
define ECMD_RxD telnet 8001 global
attr ECMD_RxD room ECMD

TCP-ECMD-Client A
define ECMD_TxD ECMD telnet 192.168.1.203:8001
attr ECMD_TxD classdefs ECMD_LED.class=/volume1/@appstore/FHEM/share/fhem/FHEM/ECMD_LED.cfg
attr ECMD_TxD room ECMD


Rückmeldekanal von B-->A
TCP-Telnet-Server A
define ECMD_RxD telnet 8000 global
attr ECMD_RxD room ECMD

TCP-ECMD-Client B
define ECMD_TxD ECMD telnet 192.168.1.3:8000
attr ECMD_TxD classdefs ECMD_LED.class=/opt/fhem/FHEM/ECMD_LED.cfg
attr ECMD_TxD room ECMD


Die beiden TCP-Verbindungen sollten jetzt stehen....

Als nächstes werden die eigentlichen Devices für die LED-Steuerung angelegt. Damit keine Schleife entsteht habe ich momentan die Steuerung und die Rückmeldung auf dem Steuernden System A getrennt angelegt.

LED Configuration
Empfängerseite B
define Error_LED RPI_GPIO 5
attr Error_LED devStateIcon on:10px-kreis-rot off:1px-spacer
attr Error_LED direction output
attr Error_LED room Overheat

Senderseite A
define RM_Error_LED dummy
attr RM_Error_LED devStateIcon on:10px-kreis-rot off:10px-kreis-gruen
attr RM_Error_LED room Overheat

define Trigger_Error_LED dummy
attr Trigger_Error_LED room Overheat
attr Trigger_Error_LED setList on off


Jetzt werden die eigentlichen Steuermodule in Form von ECMDDevices angelegt. Die Funktionen des ECMDDevices werden in den "ECMD_LED.cfg"-Files definiert. Momentan beschränke ich mich auf den "set-Befehl" dieser sendet nur einen gültigen FHEM-Befehl ohne auf eine Antwort zu warten um diese dann noch ggf. auszuwerten.

ECMD-Config-class
Senderseite A
set Error_LED_on cmd {"set Error_LED on\n\n"}
set Error_LED_off cmd {"set Error_LED off\n\n"}
set Error_LED_oft cmd {"set Error_LED on-for-timer 1\n\n"}

Empfängerseite B (Rückmeldung)
set RM_Error_LED_on cmd {"set RM_Error_LED on\n\n"}
set RM_Error_LED_off cmd {"set RM_Error_LED off\n\n"}


Jetzt fehlen noch die entsprechenden notifys um die zugehörigen Triggerereignisse zum SENDEN auszulösen.
Es ist nicht nötig auf die ankommenden Ereignisse zu reagieren, da diese schon einen in einer interpretierbaren Form beim Empfänger ankommen.

notify Triggerereignisse
Senderseite A
define Send_Error_LED_oft notify Trigger_Error_LED:on set ECMD_LED_Device Error_LED_oft
attr Send_Error_LED_oft room Overheat
#rücksetzen des Schalters (Tasterfunktion)
define Reset_Trigger_Error_LED notify Trigger_Error_LED:on set Trigger_Error_LED off
attr Reset_Trigger_Error_LED room Overheat


Empfängerseite B (Rückmeldung)
define RM_Error_LED_on notify Error_LED:on set ECMD_LED_Device RM_Error_LED_on
attr RM_Error_LED_on room Overheat

define RM_Error_LED_off notify Error_LED:off set ECMD_LED_Device RM_Error_LED_off
attr RM_Error_LED_off room Overheat


Ich werde mich jetzt mal an die Umsetzung mit FHEM2FHEM machen. Jetzt wo FHEM2FHEM auch einen Sendefilter besitzt könnte es ein Kopf-an-Kopf rennen werden....


Steuern einer entfernten LED über FHEM2FHEM:

Zuerst müssen wieder die TCP-Verbindungen definiert und hergestellt werden. Hier verwende ich den Telnet-Standard-Server-Port 7072.
Um unnötigen Datentransfer zu vermeiden setzen wir die entsprechenden Filter.
Die Verbindung von A-->B (FHEM2FHEM-Client auf B) soll nur Events Empfangen die "Tigger_F2F" enthalten.
Die Verbindung von B-->A (FHEM2FHEM-Client auf A) soll nur Events Empfangen die "RM_F2F" enthalten.
Ganz aktuell werden die Filter zwar auf den empfangenden Instanzen gesetzt, sollen aber der sendenden Seite bereits gefiltert werden. Damit wäre dann nicht nur das LOG sauber, sondern auch der echte Datenverkehr aus der Leitung!
Das werde ich mir im Nachgang noch mal anschauen.

TCP-Clients
Empfängerseite B
define FHEM_A FHEM2FHEM 192.168.1.4:7072 LOG:.*(Trigger_F2F).*
attr FHEM_A room FHEM2FHEM

Senderseite A
define FHEM_B FHEM2FHEM 192.168.1.203:7072 LOG:.*(RM_F2F).*
attr FHEM_B room FHEM2FHEM


Jetzt werden alle relevanten Ereignisse auf den Instanzen im Event-LOG registriert.
Um Endlosschleifen zu vermeiden habe ich (vorerst, vielleich kann man hier noch optimieren) auf beiden Seiten je zwei Elemente angelegt.

LED Configuration
Senderseite A
define RM_F2F_LED dummy
attr RM_F2F_LED devStateIcon on:10px-kreis-rot off:1px-spacer
attr RM_F2F_LED room FHEM2FHEM

define Trigger_F2F_LED dummy
attr Trigger_F2F_LED devStateIcon .*:Restart
attr Trigger_F2F_LED room FHEM2FHEM
attr Trigger_F2F_LED setList on off
#rücksetzen des Schalters (Tasterfunktion)
define Reset_Trigger_F2F_LED notify Trigger_F2F_LED:on set Trigger_F2F_LED off
attr Reset_Trigger_F2F_LED room FHEM2FHEM

Empfängerseite B
define F2F_LED RPI_GPIO 6
attr F2F_LED devStateIcon on:10px-kreis-rot off:1px-spacer
attr F2F_LED direction output
attr F2F_LED room FHEM2FHEM

define RM_F2F_LED dummy
attr RM_F2F_LED room FHEM2FHEM
attr RM_F2F_LED setList on off


Auch bei FHEM2FHEM müssen die zu sendenden Ereignisse angetriggert werden.
Aber anders als bei ECMD müssen bei FHEM2FHEM auch die empfangenen Ereignisse über ein notify abgefangen und weitergegeben werden.

notify Triggerereignisse
Senderseite A
define Reset_Trigger_F2F_LED notify Trigger_F2F_LED:on set Trigger_F2F_LED off
attr Reset_Trigger_F2F_LED room FHEM2FHEM

define set_RM_F2F_LED notify RM_F2F_LED:.* set RM_F2F_LED $EVENT
attr set_RM_F2F_LED room FHEM2FHEM

Empfängerseite B
define set_RM_F2F_LED notify F2F_LED:.* set RM_F2F_LED $EVENT
attr set_RM_F2F_LED room FHEM2FHEM

define Set_F2F_LED notify Trigger_F2F_LED:on set F2F_LED on-for-timer 5
attr Set_F2F_LED room FHEM2FHEM



Steuern einer entfernten LED über MQTT:

MQTT basiert auf einem recht einfachen System, aller Informationsaustausch findet über einen sogenannten Broker (Makler, Vermittler) statt. Der MQTT-Brocker ist ein autark laufender Server. Hie kann z.B. Mosquitto genutzt werden.
Ich habe hierfür vorerst Mosquitto auf einem Raspberry installiert.

Installation Mosquitto-Broker
http://www.reddit.com/r/raspberry_pi/comments/2tbsj8/running_mosquitto_mqtt_broker_on_raspberry_pi/

wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
rm mosquitto-repo.gpg.key

cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.list
sudo apt-get update

sudo apt-get install mosquitto mosquitto-clients


Vom Prinzip her kann man am MQTT-Broker anmelden das man gerne Daten zur Verfügung stellen möchte.
Dies wird dem Broker mit einem PUBLISH (ich möchte etwas publizieren) mitgeteilt.
Wer Interesse an diesen Informationen hat kann beim Broker ein SUBSCRIBE eintragen (Abo anmelden).
(http://1.f.ix.de/developer/imgs/06/1/2/0/6/3/3/2/abb1-91e2bb4ffde20da8.jpeg)

Als Trockenübung kann können auf dem Broker-Raspberry zwei SSH-Konsolen geöffnet werden.
In der ersten Konsole trägt man sich für ein Abo ein:
mosquitto_sub -d -t hello/world
In der zweiten Konsole kann nun publiziert werden:
mosquitto_pub -d -t hello/world -m "Greetings from Terminal window 2"
Diese Nachricht sollte jetzt im ersten Terminal zu sehen sein.....

Der Broker läuft!

Unter FHEM erledigen die Module MQTT, MQTT_Bridge und MQTT_Device all diese schönen Sachen für uns.
MQTT stellt die Verbindung zum Broker her.
MQTT_Bridge ist die Brücke für ein bestehenden Device zum Broker.
MQTT_Device ist ein Device der auf Brokerinformationen zugreifen möchte, ein Dummy ist daher nicht mehr notwendig.

Zuerst stellen wir in beiden FHEM-Instanzen die Verbindung zum MQTT-Broker her:
TCP-Broker-Verbindung
Senderseite A

define Broker_202 MQTT 192.168.1.202:1883
attr Broker_202 room MQTT

Empfängerseite B

define Broker_202 MQTT 192.168.1.202:1883
attr Broker_202 room MQTT


Beide FHEM-Instanzen sollten jetzt eine Verbindung zum Broker haben.

Als nächstes benötigen wir einen MQTT_Device auf der steuernden Instanz A und eine MQTT_Bridge auf der Instanz mit der LED(GPIO).

MQTT_Device/_Bridge
Senderseite A

define MQTT_Error_LED MQTT_DEVICE
attr MQTT_Error_LED IODev Broker_202
attr MQTT_Error_LED publishSet on off /Error_LED/state/set
attr MQTT_Error_LED room MQTT
attr MQTT_Error_LED stateFormat state
attr MQTT_Error_LED subscribeReading_state /Error_LED/state
attr MQTT_Error_LED userReadings _state


Rückmeldung der LED (GPIO) abonnieren
attr MQTT_Error_LED subscribeReading_state /Error_LED/state
Set Kommando für die Steuerung der LED (GPIO) publizieren.
attr MQTT_Error_LED publishSet on off /Error_LED/state/set

Empfängerseite B

define MQTT_Error_LED MQTT_BRIDGE Error_LED
attr MQTT_Error_LED IODev Broker_202
attr MQTT_Error_LED publishState /Error_LED/state
attr MQTT_Error_LED room MQTT
attr MQTT_Error_LED stateFormat transmission-state
attr MQTT_Error_LED subscribeSet /Error_LED/state/set


Rückmeldung publizieren
attr MQTT_Error_LED publishState /Error_LED/state
Steuerung abonnieren
attr MQTT_Error_LED subscribeSet /Error_LED/state/set

Das war es schon! Und das Ganze ohne Schleifenproblem!
Der Pfad (/Error_LED/state) "Topic" genannt, kann frei gewält werden und bringt selbst komplexe Strukturen unter Kontrolle.


Das läuft soweit, vielleicht hat noch jemand Verbesserungsvorschläge.
Ich hoffe auch, dass der Beitrag jemandem den Start etwas vereinfacht.

Momentan ist MQTT für mich das Mittel der Wahl.
Gehirnknoten und Filter-Exzesse zum Vermeiden von Schleifen sind eigentlich modulbedingt ausgeschlossen.


Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

kvo1

Danke für die gute Beschreibung.... Ich lese hier mal mit ;)
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

Thargor

Ich bin auch sehr an den Erkenntnissen interessiert, da ich ähnliches vorhabe. ECMD hatte ich da noch gar nicht auf dem Plan. Daher schonmal: Vielen Dank!

Pf@nne

FHEM auf: DS415+ (Master), Raspberry Pi 2

justme1968

schau dir mal das hier: http://forum.fhem.de/index.php/topic,23638.msg169368.html#msg169368 (und den zugehörigen post 6 beiträge darüber) an.

in dieser fhem2fhem basierten version wird statt des dummys ein readingProxy verwendet und so ein notify eingespart. das notify auf der gegenseite ist etwas anderes definiert und für mehr als ein device verwendbar.

gruss
andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

John

Da scheint mir eine Lösung via MQTT doch wesentlich einfacher und universeller.

Vorteile:
* du nutzt einen offenen Standard, der von vielen Tools direkt unterstützt wird
* wenn du neue Technologien, wie Node-Red nutzen willst, kannst die dies mit allen MQTT-Sensoren/Aktoren sofort nutzen
* du kannst auch 50 FHEM Instanzen mit den Infos des LED-Status "beglücken" oder diese die LED schalten lassen
* ...

Wer an MQTT einmal "gerochen" hat, will nichts anderes mehr.

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Pf@nne

Moin Andre,

danke für den readingProxy Tipp, werde ich versuchen umzusetzen, ich werde aber erstmal in MQTT reinschauen.
Als Newbie stehe ich mit der FHEM/Perl-Syntax ziemlich auf Kriegsfuß, du hast nicht zufällig Lust und Zeit das o.g. Beispiel umzuschreiben? Ein ungetestetes Beipiel auf o.g. Basis würde langen. Ich versuche das dann nachzuvollziehen und würde es sauber einpflegen.

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

#7
ZitatWer an MQTT einmal "gerochen" hat, will nichts anderes mehr.
Da könnte was dran sein!!

Ich habe mal einen Mosquitto-Broker auf einem Raspberry aufgemacht und local ein wenig "gespielt" sieht vielversprechend aus.
Leider scheitere ich beim definieren des MQTT-Clients auf meiner Synology-FHEM-Instanz.

Die pm´s sollten aktuell sein...

-rw-r--r--    1 root     root        15683 Mar 15 19:01 00_MQTT.pm
-rw-r--r--    1 root     root          7475 Mar 15 19:01 10_MQTT_BRIDGE.pm
-rw-r--r--    1 root     root          8156 Mar 15 19:01 10_MQTT_DEVICE.pm


define Broker_202 MQTT 192.168.1.202:1883
bringt folgenden Fehler:
Cannot load module MQTT

?? Was mache ich schon wieder falsch?

EDIT:
Auf einer Raspberry-FHEM-Instanz funktioniert es....muss also an der Synology-FHEM-Instanz liegen.
FHEM auf: DS415+ (Master), Raspberry Pi 2

John

Bei mir sieht das so aus

Zitat-rw-r--r-- 1 fhem dialout 15683 Nov 14 09:14 00_MQTT.pm
-rw-r--r-- 1 fhem dialout  7475 Nov 14 09:14 10_MQTT_BRIDGE.pm
-rw-r--r-- 1 fhem dialout  8156 Nov 14 09:14 10_MQTT_DEVICE.pm

Sind bei dir user und group korrekt eingestellt ?
root.root scheint verdächtig.

version liefert
# $Id: 00_MQTT.pm 6935 2014-11-09 20:35:34Z ntruchsess $
# $Id: 10_MQTT_BRIDGE.pm 6935 2014-11-09 20:35:34Z ntruchsess $
# $Id: 10_MQTT_DEVICE.pm 6935 2014-11-09 20:35:34Z ntruchsess $


John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Pf@nne

Moin John,

ich denke nicht, liegt aber daran, das ich im Grunde gar nicht so richtig weiß wie ich das auf der Synology-DS einstellen soll... :-\

Kannst du mit dabei helfen....?

P.S.
Von Raspberry zu Raspberry klappt das publishen und subscriben schon prima.
Die Error_LED published über eine MQTT_Bridge und ein MQTT_Device auf einem Anderen Raspberry hat das _state subscribed....
Echt geil, und um längen übersichtlicher bis jetzt.... klasse Tipp!!
FHEM auf: DS415+ (Master), Raspberry Pi 2

schka17

Kann es sein dass die notwendigen Perl Module auf der Synology fehlen?


Sent from my iPad using Tapatalk
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

John

Bei mir liefert der Befehl (ausgehend vom FHEM Verzeichnis)
ls -la FHEM/lib/Net/MQTT
folgendes
drwxrwxr-x 4 fhem dialout 4096 M�r  5 17:30 .
drwxrwxr-x 4 fhem dialout 4096 M�r  5 17:30 ..
-rw-rw-r-- 1 fhem dialout 6307 M�r  5 17:30 Constants.pm
drwxrwxr-x 3 fhem dialout 4096 M�r  5 17:30 Message
-rw-rw-r-- 1 fhem dialout 5874 M�r  5 17:30 Message.pm
drwxrwxr-x 6 fhem dialout 4096 M�r  5 17:30 .svn
-rw-rw-r-- 1 fhem dialout 2264 M�r  5 17:30 TopicStore.pm


Wie siehts bei dir aus ?

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Pf@nne

Ich fürchte hier fehlt was in der Syno-FHEM-Instanz

/volume1/@appstore/FHEM/share/fhem/FHEM/lib # find / -name "*MQTT*"
/volume1/@appstore/FHEM/share/fhem/FHEM/00_MQTT.pm
/volume1/@appstore/FHEM/share/fhem/FHEM/10_MQTT_BRIDGE.pm
/volume1/@appstore/FHEM/share/fhem/FHEM/10_MQTT_DEVICE.pm

mehr MQTT habe ich nicht....

Der Raspberry hat da mehr zu bieten:

root@Raspberry202:~# find / -name "*MQTT*"
/opt/fhem/FHEM/10_MQTT_DEVICE.pm
/opt/fhem/FHEM/10_MQTT_BRIDGE.pm
/opt/fhem/FHEM/lib/Net/MQTT
/opt/fhem/FHEM/lib/Net/MQTT.pod
/opt/fhem/FHEM/00_MQTT.pm



root@Raspberry202:/opt/fhem/FHEM/lib/Net# ls -la
total 16
drwxr-xr-x 3 fhem root 4096 Dec 28 14:25 .
drwxr-xr-x 7 fhem root 4096 Mar 16 18:42 ..
drwxr-xr-x 3 fhem root 4096 Dec 28 14:25 MQTT
-rw-r--r-- 1 fhem root 1078 Nov  9 14:16 MQTT.pod


FHEM auf: DS415+ (Master), Raspberry Pi 2

John

CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Pf@nne

#14
Läuft!


2015-04-19 22:01:50 MQTT_DEVICE MQTT_Error_LED transmission-state: incoming publish received
2015-04-19 22:01:50 MQTT_DEVICE MQTT_Error_LED off
2015-04-19 22:01:51 MQTT_DEVICE MQTT_Error_LED transmission-state: incoming publish received
2015-04-19 22:01:51 MQTT_DEVICE MQTT_Error_LED on


Wahnsinn....jetzt fehlt nur noch das Senden eines Set´s... zum Steuern des fernen GPIOs.

Schon jetzt ist aber abzusehen, dass MQTT wohl die richtige Wahl ist.


Erstmal danke für die Unterstützung.

P.S. Ich habe die Files von meinem Raspberry einfach kopiert, wie hätte ich das auf der Konsole "einfach" auschecken können?
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

FHEM auf: DS415+ (Master), Raspberry Pi 2

John



MQTT-Spy ist absolut überragend als MQTT-Client
http://kamilfb.github.io/mqtt-spy/

Node-Red ist ein Wiring-Tool, das man sich ansehen muss (natürlich unterstützt es MQTT)
http://forum.fhem.de/index.php/topic,35599.msg279427.html#msg279427

Freeboard läuft mit MQTT
http://forum.fhem.de/index.php/topic,35800.msg281297.html#msg281297

Wer das Match wohl gewinnt ?

John
CubieTruck Docker Node-Red Tasmota Shelly Homematic-IP

Pf@nne

Das Rennen ist entschieden, MQTT macht sich wirklich gut....
Die Links schaue ich mir mal an....

Kannst du den MQTT - TEIL mal auf groben Unfug hin querlesen?

Gruß
PF@NNE
FHEM auf: DS415+ (Master), Raspberry Pi 2

Pf@nne

#18
Die 1:1 Verbindung klappt ja schon ganz gut.. ;D

Wenn ich es richtig verstanden habe MQTT-BRIDGE immer mit einem real existierenden Device verbunden.
Daher musss für jeden Device eine eigene BRIDGE angelegt werden.

Ist dem so?

Wie verhält es sich mit dem MQTT_DEVICE?
Kann ein MQTT_DEVICE mehrere readings unterschiedlicher BRIDGEes"subscriben" ?

attr MQTT_Error_LED subscribeReading_state /Error_LED1/state
attr MQTT_Error_LED subscribeReading_state /Error_LED2/state


Warum gibt es im WebIF-Dropdown nur ein "subcribeReading_.*", ich habe das dann händisch in ein "subcribeReading_state" geändert, weil ich sonst nichts lesen konnte.
Mache ich da noch was verkehrt?

Ich hoffe ihr könnt mir helfen.

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

schka17

Zur ersten Frage, MQTT_DEVICE subscribed zu einem Topic, dabei wird das IO device zum Broker verwendet, sollte also möglich sein in einem Device unterschiedliche Topics zu subscriben, habe ich aber noch nicht ausprobiert, ist für meine Anwendungen nicht denkbar da sich dann die Namen der Readings gleichen würden, ich denke das geht dann nicht.

Zur zweiten Frage, du kannst auch mit dem attr autosubscribereadings die readings automatisch anlegen lassen. Klarerweise kann es im Dropdown nur wildcards geben, ist ja noch nicht bekannt welche Topics subscribed werden sollen.


Sent from my iPad using Tapatalk
M: Thinclient x64 Debian | CUL FS20, HMS100WD, HMS100TF, HMS100T, HMS100CO, S300, S555TH | OWServer DS1420, DS18B20, DS2408 | RFXCOM UVN128, THWR800, THGR228N,RTGR328, PCR800 |Jeelink PCA301 EC3000|CUNO+IR|HMLAN|HMUSB|CUL433 Somfy|mySensors|espEasy
S1:Raspberry mit BPM810, Jeelink EC3000

bgewehr

Hat schon jemand eine Lösung für MQTT und Raspberry GPIO gefunden?

Ich stehe grade an derselben Stelle ratlos...
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Pf@nne

Moin,

was genau meinst du mit MQTT und GPIO?
Ich sehe da momentan keinen Zusammenhang?

Beschreibe mal was du vorhast.

Gruß
Pf@nne
FHEM auf: DS415+ (Master), Raspberry Pi 2

bgewehr

#22
MQTT wird verwendet, um die LAN Kommunikation zu machen. Da aber die Raspberry GPIO geschaltet werden sollen, braucht es noch einen MQTT Client, der bei entspr. Messages den Status der PINs setzt oder auf Statuswechsel eines PINs eine Message sendet. Dies tut der MQTT-GPIO-Monitor von Sumnerboy aus GitHub. Aber leider mal wieder nicht problemlos, ich bekomme da Connection refused Fehler bei der Verbindung zu mosquitto.

https://github.com/sumnerboy12/mqtt-gpio-monitor/issues/3
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

bgewehr

Funktioniert nun! Ich poste mal die Config später!
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

rretsiem

Hallo,

Altes Thema, ich weiß hat mir aber sehr dabei geholfen eine Entscheidung zu treffen wie ich den 2. rPi im Dachboden für den Stromzähler mit meinem "Haupt-FHEM" verbinde.
Ich hatte das nämlich erst mit Fhem2Fhem gelöst aber das ist im Vergleich zu MQTT viel zu kompliziert. Mittlerweile sprechen die beiden Pis nur noch via MQTT miteinander und tauschen Events aus. Im Moment nur in eine Richtung vom Dachboden zum primären aber das klappt so was von zuverlässig, dass ich das hier einfach mal los werden muss.

Wer noch etwas Input benötigt:

Dachboden Pi (metis) mit OBIS Modul sendet Events an den MQTT Broker (Ebenfalls auf dem Haupt-FHEM Pi (loki) am laufen):

Einmal zum Broker connecten mit dem MQTT Modul


Internals:
   DEF        loki:1883
   DeviceName loki:1883
   FD         4
   NAME       MQTT_Broker_loki
   NOTIFYDEV  global
   NR         21
   NTFY_ORDER 50-MQTT_Broker_loki
   PARTIAL
   STATE      opened
   TYPE       MQTT
   buf
   msgid      1
   ping_received 1
   timeout    60
   Readings:
     2016-04-28 19:38:59   connection      active
     2016-04-28 19:27:59   state           opened
   Messages:


Und einmal die "Bridge" die von einem FHEM Device (powerMeter) Nachrichten an den Broker schickt.


Internals:
   DEF        powerMeter
   IODev      MQTT_Broker_loki
   NAME       MQTT_PowerMeter
   NOTIFYDEV  powerMeter
   NR         22
   NTFY_ORDER 50-MQTT_PowerMeter
   STATE      outgoing publish sent
   TYPE       MQTT_BRIDGE
   qos        0
   retain     0
   Readings:
     2016-04-28 19:36:38   transmission-state outgoing publish sent
   Publishreadings:
     power      /PowerMeter/power
     zaehlerStand /PowerMeter/zaehlerStand
   subscribe:
   subscribeExpr:
Attributes:
   IODev      MQTT_Broker_loki
   publishReading_power /PowerMeter/power
   publishReading_zaehlerStand /PowerMeter/zaehlerStand
   room       MQTT
   stateFormat transmission-state


Auf dem primären FHEM auf dem auch "mosquitto" als MQTT Broker läuft:


Internals:
   DEF        loki:1883
   DeviceName loki:1883
   FD         5
   NAME       MQTT_Broker_loki
   NOTIFYDEV  global
   NR         248
   NTFY_ORDER 50-MQTT_Broker_loki
   PARTIAL
   STATE      opened
   TYPE       MQTT
   buf
   msgid      8
   ping_received 1
   timeout    60
   Readings:
     2016-04-28 19:38:28   connection      active
     2016-04-26 16:42:10   state           opened
   Messages:
Attributes:
   room       Ressourcen


Und schließlich noch ein MQTT_Device (MQTT_PowerMeter) welches wie ein "normales" Device angesprochen wird und die Readings liefert:


Internals:
   CHANGED
   IODev      MQTT_Broker_loki
   NAME       MQTT_PowerMeter
   NR         249
   STATE      6.8394 kWh / Gesamt: 73.187 kWh
   TYPE       MQTT_DEVICE
   qos        0
   retain     0
   Readings:
     2016-04-28 19:42:14   costsDay        1.33231512 €
     2016-04-28 19:42:14   power           172.7
     2016-04-28 19:42:14   statPowerDay    Min: 64.5 Avg: 365.1 Max: 3844.2
     2016-04-27 23:59:55   statPowerDayLast Min: 63.5 Avg: 273.5 Max: 4121.9
     2016-04-28 19:42:14   statPowerMonth  Min: 63.5 Avg: 322.7 Max: 4340.9 (since: 2016-04-25_13:22:56 )
     2016-04-28 19:42:14   statPowerYear   Min: 63.5 Avg: 322.7 Max: 4340.9 (since: 2016-04-25_13:22:56 )
     2016-04-28 19:42:14   statZaehlerStand Hour: 0.5933 Day: 6.8394 Month: 20.0619 Year: 20.0619 (since: 2016-04-26 )
     2016-04-28 19:42:14   statZaehlerStandDay 6.8394
     2016-04-27 23:59:55   statZaehlerStandDayLast 6.3928
     2016-04-28 18:59:55   statZaehlerStandLast Hour: 0.2323 Day: 6.3928 Month: - Year: -
     2016-04-28 19:42:14   statZaehlerStandMonth 20.0619
     2016-04-28 19:42:14   transmission-state incoming publish received
     2016-04-28 19:42:14   zaehlerStand    73.187
   Helper:
     _98_statistics statPowerMeter
   Message_ids:
   Sets:
   subscribe:
     /PowerMeter/power
     /PowerMeter/zaehlerStand
   subscribeExpr:
     ^\/PowerMeter\/power$
     ^\/PowerMeter\/zaehlerStand$
   Subscribereadings:
     /PowerMeter/power power
     /PowerMeter/zaehlerStand zaehlerStand
Attributes:
   IODev      MQTT_Broker_loki
   event-min-interval zaehlerStand:300,statZaehlerStandDay:3600,statZaehlerStandMonth:7200
   event-on-update-reading power,statZaehlerStandDay,zaehlerStand,statZaehlerStandDayLast
   group      Strom
   room       Dachboden,Wohnung
   stateFormat statZaehlerStandDay kWh / Gesamt: zaehlerStand kWh
   subscribeReading_power /PowerMeter/power
   subscribeReading_zaehlerStand /PowerMeter/zaehlerStand


Auf dem Device kann ich dann mit Logfiles, Graphen usw. Alles tun was ich auch auf einem richtigen Device mache.

Funktioniert klasse!
Die CPU-Last ist nicht angestiegen dadurch und der Netzwerk-Traffic hält sich Dank der Effizienz durch MQTT absolut in Grenzen. Der Momentanverbrauch und Zählerstand aus den Readings wird alle 5 Sekunden durch einen Event direkt übermittelt.


Edit: Hatte erst vor das in die Code-Snippets Abteilung zu packen aber habe mich nicht getraut  :-[

kvo1

Hallo rretsiem,
Danke das Du dies hier vorstellst, genau das habe ich auch noch vor und wollte das eigentlich wie Du über F2F realisieren.
Ich habe im Keller einen RPI an der Heizung und den Haupt-Fhem-Server ist 2 Etagen höher.

Könntest Du mal genauer beschreiben, was man wie und wo genau installieren muß und ggf. der Teil (Define ...etc) aus der konfig posten

Wäre toll, dann muß ich nicht bei Null anfangen !
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

rretsiem

Klar kann ich das machen, im ersten Post auf der Seite steht eigentlich schon das meiste.
Hier nochmal zusammengefasst:

Mosquitto MQTT Broker auf deinem "Haupt-Server" installieren (Achtung ich nutze Debian Jessie, daher die .list anpassen, falls du Wheezy nutzt!)


wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
rm mosquitto-repo.gpg.key

cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update

sudo apt-get install mosquitto mosquitto-clients


Das dauert je nach Pi ein wenig (auf dem rPi 3 gehts flott).
Danach ist dein MQTT Broker mit der IP des Servers auf Port 1883 erreichbar.

Der Rest in FHEM:

Anlegen eines Broker IODevs auf beiden FHEM Instanzen!


define MQTT_Broker_loki MQTT <ip>:1883
attr MQTT_Broker_loki room MQTT



Auf dem Sender (Bei dir Heizungsraum):


define MQTT_PowerMeter MQTT_BRIDGE powerMeter
attr MQTT_PowerMeter IODev MQTT_Broker_loki
attr MQTT_PowerMeter publishReading_power /PowerMeter/power
attr MQTT_PowerMeter publishReading_zaehlerStand /PowerMeter/zaehlerStand


"powerMeter" ist das FHEM Device welches die Events eigentlich erzeugt, bei mir halt ein powerMeter welches den Stromzähler liest.
Mit den publishReading_<ReadingName> /PowerMeter/power kannst du dir schöne Strukturen aufbauen, ein
publishReading_Oelstand /Keller/Heizung/Oelstand
wäre da denkbar wenn du ein Reading Oelstand am FHEM device hast.
Du kannst da beliebig viele Readings hinterlegen. Ich habe noch mittels event-on-update-reading auf dem FHEM device die Events eingeschränkt auf die die ich auch via MQTT übertragen möchte um unnötig Traffic/Last zu erzeugen auf dem alten rPi (Model B).

Wichtig ist halt zu verstehen, dass du pro FHEM Device welches du via MQTT publishen möchtest ein MQTT_BRIDGE Device benötigst mit den entsprechenden Readings via publishReading_*

Das wars auf dem Sender schon.

Auf dem Primären Server: (den MQT Broker von oben nicht vergessen!)

Anlegen eines "Pseudo PowerMeter Devices" als MQTT Device welches die Readings später erhält.


define MQTT_PowerMeter MQTT_DEVICE
attr MQTT_PowerMeter IODev MQTT_Broker_loki
attr MQTT_PowerMeter group Strom
attr MQTT_PowerMeter room Dachboden,Wohnung
attr MQTT_PowerMeter subscribeReading_power /PowerMeter/power
attr MQTT_PowerMeter subscribeReading_zaehlerStand /PowerMeter/zaehlerStand


Hier ähnlich wie auf der Sender-Seite, via subscribeReading_<ReadingName> /PowerMeter/power erhalte ich ein Reading power am Device MQTT_PowerMeter. Die Struktur habe ich oben ja schon kurz erklärt.

Auf dem Device kannst du nun alle Schandtaten anstellen die du auch mit einem "normalen" FHEM Device anstellen kannst, also FileLog anhängen, Events/Notify/DoIfs usw.
Sobald vom MQTT Sender eine Nachricht via publish geschickt wird erhält der Empfänger diese und schreibt sie in das entsprechende Reading.

Ich habe das im Moment eben nur in eine Richtung laufen aber dafür überwache ich den Zählerstand und ebenfalls (gleiches Vorgehen) via SYSMON bekomme ich die CPU Temperatur, den Load auf meinem primären FHEM-Server gepusht. Was ich im Moment nicht mache ist auch in die gegengesetzte Richtung etwas schicken, weil ich dafür keinen Anwendungsfall habe (im Moment!)

Wenn du noch Fragen hast, einfach melden.

Evtl. Sollte ich doch ein eigenes Topic eröffnen dafür.

bgewehr

Plus 1 für MQTT. Meine Erfahrungen sind auch sehr gut!
FritzBox 7590, Synology DS216+II mit Docker
Docker: FHEM mit hmlan, Homebridge, node-red, mosquitto, ems-collector für Buderus EMS mit AVR Net-IO
Gartenwasser über MQTT auf R/Pi A+
Volkszaehler.org auf R/Pi 2B mit Pi_Erweiterung
Raspberrymatic auf R/Pi 4B mit RPI-RF-MOD u. CUL868

Thomas41587

Hallo zusammen,
ich würde diesen schon etwas älteren Thread mal ausgraben, da ich vor einem ähnlichen Problem stehe.
Die Beispiele wie im Thread geschrieben (dummy LED-device steuern) funktionierte auf anhieb.
Aber jetzt stehe ich vor der Herausforderung, dass ein I2C Gerät geschalten werden soll, welches (leider) viele readings hat. Und genau diese bekomme ich nicht geschalten :-( geht das überhaupt mit dem beschrieben Weg? Oder muss ich hier explizite set-Befehle angeben (nur wo?)

Mein I2C device:
Internals:
   CFGFN     
   DEF        0x41
   FUUID      5d8c59e3-f33f-1e1e-91e8-86b8c4a2c745b433
   Frequency  82.5 Hz
   I2C_Address 65
   IODev      RPII2C_1
   NAME       I2C_PCA9685_esszimmer
   NR         21
   RPII2C_1_SENDSTAT Ok
   STATE      Ok
   TYPE       I2C_PCA9685
   READINGS:
     2019-09-27 09:49:33   Port00          4095
     2019-09-27 09:49:33   Port01          4095
     2019-09-27 09:49:33   Port02          4095
     2019-09-27 09:49:33   Port03          4095
     2019-09-27 09:49:33   Port04          4095
     2019-09-27 09:49:33   Port05          4095
     2019-09-27 09:49:33   Port06          4095
     2019-09-27 09:49:33   Port07          4095
     2019-09-27 09:49:33   Port08          4095
     2019-09-27 09:49:33   Port09          4095
     2019-09-27 09:49:33   Port10          4095
     2019-09-27 09:49:33   Port11          4095
     2019-09-27 09:49:33   Port12          4095
     2019-09-27 09:49:33   Port13          4095
     2019-09-27 09:49:33   Port14          4095
     2019-09-27 09:49:33   Port15          4095
     2019-09-27 09:50:27   Port_d00        0
     2019-09-27 09:50:27   Port_d01        0
     2019-09-27 09:50:27   Port_d02        0
     2019-09-27 09:50:27   Port_d03        0
     2019-09-27 09:50:27   Port_d04        0
     2019-09-27 09:50:27   Port_d05        0
     2019-09-27 09:50:27   Port_d06        0
     2019-09-27 09:50:27   Port_d07        0
     2019-09-27 09:50:27   Port_d08        0
     2019-09-27 09:50:27   Port_d09        0
     2019-09-27 09:50:27   Port_d10        0
     2019-09-27 09:50:27   Port_d11        0
     2019-09-27 09:50:27   Port_d12        0
     2019-09-27 09:50:27   Port_d13        0
     2019-09-27 09:50:27   Port_d14        0
     2019-09-27 09:50:27   Port_d15        0
     2019-09-27 09:52:19   state           Ok
   confregs:
     ALLCALLADR 224
     PRESCALE   73
     SUBADR1    226
     SUBADR2    228
     SUBADR3    232
     modereg1   32
     modereg2   16
Attributes:
   IODev      RPII2C_1
   OnStartup  0=off,1=on,2=off,3=off
   modereg2   INVRT
   prescale   73
   room       MQTT


Die Bridge:
defmod MQTT_I2C_PCA9685_esszimmer MQTT_BRIDGE I2C_PCA9685_esszimmer
attr MQTT_I2C_PCA9685_esszimmer IODev MQTT_server
attr MQTT_I2C_PCA9685_esszimmer publishState /I2C_PCA9685_esszimmer/Port00
attr MQTT_I2C_PCA9685_esszimmer room MQTT
attr MQTT_I2C_PCA9685_esszimmer stateFormat transmission-state
attr MQTT_I2C_PCA9685_esszimmer subscribeSet /I2C_PCA9685_esszimmer/Port00/set


Und das Device (auf der Haupt-FHEM Instanz):
defmod MQTT_I2C_PCA9685_esszimmer MQTT_DEVICE
attr MQTT_I2C_PCA9685_esszimmer IODev MQTT_server
attr MQTT_I2C_PCA9685_esszimmer publishSet on off /I2C_PCA9685_esszimmer/Port00/set
attr MQTT_I2C_PCA9685_esszimmer room MQTT
attr MQTT_I2C_PCA9685_esszimmer stateFormat state
attr MQTT_I2C_PCA9685_esszimmer subscribeReading_state /I2C_PCA9685_esszimmer/Port00
attr MQTT_I2C_PCA9685_esszimmer userReadings _Port00


Schalte ich von der Haupt-FHEM Instanz, so passiert auch etwas (ich kan on/off schalten) aber das I2C Gerät ändert seinen Port00 nicht (set I2C_PCA9685_esszimmer Port00 on funktioniert natürlich, wenn ich es manuell ausführe).

Ich bin hier ein wenig ratlos und wäre für Hilfe dankbar...