[Bugs] 00_MQTT2_SERVER / 10_MQTT2_DEVICE

Begonnen von betateilchen, 10 August 2018, 18:01:33

Vorheriges Thema - Nächstes Thema

eldrik

#30
Zitat von: rudolfkoenig am 13 August 2018, 14:42:38
Wie es schon da steht: UNSUBSCRIBE habe ich nicht implementiert.
Kannst du dein Programm nicht ueberzeugen, es nicht zu senden? Und wozu macht es direkt nach SUBSCRIBE ein USUBSCRIBE? Ein DISCONNECT reicht doch :)
Wenn nicht, kannst du mir zeigen, wie ich das nachstellen kann, ohne Tage mit Installation von Programmen zu verbringen?

Das mit der Implementierung habe ich mir gedacht  ;) und das Programm bediene ich ja, in dem Moment, selber um zu testen was bei einem Usubscribe passiert, theoretisch könnte ja jedes Mqtt Device Topics unsubscriben, ohne das es die Verbindung zum Broker vollständig beenden will.

Das deshalb die komplette Verbindung gedroped wird mag ein wenig hart sein.  :)

Mqtt.fx ist meine ich eine Java Anwendung, die Installation in meiner Mac VM hat keine 5Minuten gedauert, mit anderen Clients kann ich nicht dienen. Alternativ hat vl. Espeasy einen mqtt Client mit dem man Subscriben und Unsubscriben kann?

Greetz
Eldrik

betateilchen

Ansonsten hat die SAP Cloud Platform einen mqtt Client :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Billy

Was macht define mqcl MQTT localhost:1883
Ist mir nicht ganz klar.
Zitat von: betateilchen am 13 August 2018, 14:12:14
Naja, mit dem ersten define (MQTT2_SERVER) instanziierst Du zuerst einen MQTT Server (der von FHEM gebildet wird). (Quasi der Ersatz für den mosquitto)

Im zweiten define benutzt Du dann das bisher übliche Modul MQTT, um FHEM mit diesem Server (also sich selbst) zu verbinden.

Alle anschließend definierten Geräte MQTT_DEVICE (nicht MQTT2_DEVICE !) und MQTT_BRIDGE müssen dann das mit MQTT definierte IODev verwenden.
Zitat von: rudolfkoenig am 13 August 2018, 14:48:55
Eine Verbindung zum MQTT Server aufbauen. Soweit ich als Laie sehe, brauchen beide (10_MQTT_BRIDGE.pm oder 10_MQTT_GENERIC_BRIDGE.pm) eine MQTT Instanz.
Danke für Eure Antworten, werde ich ausgiebig testen!
Billy
FHEM immer akt. auf 3 BeagleBoneBlack: 2xHMLAN 2xJeelink ;10x HM-CC-TC, 13x HM-CC-VD, 1x HM-ES-PMSw1-Pl, 3x HM-LC-SW1-PL2, viele ESP8266, Tasmota Scripting, Mqtt*

CoolTux

Zitat von: rudolfkoenig am 11 August 2018, 09:01:43
Habe TcpServerUtils modifiziert, setze da state mit readingsSingleUpdate, allerdings ohne trigger. Bin auf Nebeneffekte gespannt.

Nebeneffekt???

https://forum.fhem.de/index.php/topic,90221.0.html
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

ThoTo

1)
Der Versuch ein gesetztes Attribut getList/setList/readingList für ein MQTT2_DEVICE zu löschen führt zu folgendem Fehler:
Sonoff_Testdevice attr getList/setList/readingList: more parameters needed

2)
Beim Versuch die Variable $name in getList/setList/readingList zu verwenden, erhalte ich einen Fehler:
on { "cmnd/".AttrVal($name,"MQTTName","")."/POWER on" }
off { "cmnd/".AttrVal($name,"MQTTName","")."/POWER off" }

Global symbol "$name" requires explicit package name at (eval 377) line 1.


LG Thomas
KNX | MQTT | Docker | Sonos | FHEMapp

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)

betateilchen

zu 1: es wäre schön, wenn Du geschrieben hättest, wie Du das Attribut löschen wolltest - funktioniert das "deleteattr" hinter der Anzeige nicht?
zu 2: die Variable heißt $NAME und nicht $name

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ThoTo

Zitat von: betateilchen am 14 August 2018, 13:39:35
zu 1: es wäre schön, wenn Du geschrieben hättest, wie Du das Attribut löschen wolltest - funktioniert das "deleteattr" hinter der Anzeige nicht?

deleteattr hinter der Anzeige oder alternativ deleteattr Devicename setList

Zitat von: betateilchen am 14 August 2018, 13:39:35
zu 2: die Variable heißt $NAME und nicht $name

Ergebnis nach Änderung:
Global symbol "$NAME" requires explicit package name at (eval 28) line 1.

LG Thomas
KNX | MQTT | Docker | Sonos | FHEMapp

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)

betateilchen

Zitat von: ThoTo am 14 August 2018, 14:26:45
deleteattr hinter der Anzeige oder alternativ deleteattr Devicename setList

Wie konntest Du überhaupt ein Attribut mit zu wenigen Parametern setzen, das Du jetzt löschen möchtest? Das muss sich wohl Rudi anschauen.

Zitat von: ThoTo am 14 August 2018, 14:26:45
Ergebnis nach Änderung:
Global symbol "$NAME" requires explicit package name at (eval 28) line 1.

Dann schreib halt das Topic komplett mit dem tatsächlichen Namen in das Attribut.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

ThoTo

Zitat von: betateilchen am 14 August 2018, 14:54:51
Wie konntest Du überhaupt ein Attribut mit zu wenigen Parametern setzen, das Du jetzt löschen möchtest? Das muss sich wohl Rudi anschauen.

Gar nicht. Ich hab's mit dem Code aus Rudis Ankündigung versucht und hätte somit gehofft dass du das Verhalten reproduzieren kannst.
define sonoff_th10 MQTT2_DEVICE
attr sonoff_th10 readingList tele/sonoff/S.* { MQTT2_JSON($EVENT) }
attr sonoff_th10 setList\
on tasmota/sonoff/cmnd/Power1 on\
off tasmota/sonoff/cmnd/Power1 off


deleteattr sonoff_th10 readingList

Ergebnis:  sonoff_th10 attr readingList: more parameters needed


LG Thomas
KNX | MQTT | Docker | Sonos | FHEMapp

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)

betateilchen

#39
 ;D

Da hat Rudi sich selbst ausgetrickst...


  my ($type, $dev, $attrName, $param) = @_;

  if($attrName =~ m/(.*)List/) {
    my $type = $1;

    if($type eq "del") {
      MQTT2_DEVICE_delReading($dev) if($type eq "reading");
      return undef;
    }


Erst wird geprüft, ob $type eq "del" und dann auch gleichzeitig noch eq "reading" ist? Das wird schwierig zu erfüllen sein.

Lösungsvorschlag:


Index: 10_MQTT2_DEVICE.pm
===================================================================
--- 10_MQTT2_DEVICE.pm  (revision 17135)
+++ 10_MQTT2_DEVICE.pm  (working copy)
@@ -290,10 +290,10 @@
   my ($type, $dev, $attrName, $param) = @_;

   if($attrName =~ m/(.*)List/) {
-    my $type = $1;
+    my $atype = $1;

     if($type eq "del") {
-      MQTT2_DEVICE_delReading($dev) if($type eq "reading");
+      MQTT2_DEVICE_delReading($dev) if($atype eq "reading");
       return undef;
     }



-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

SamNitro

Bei meinem anderen MQTT Server bekomme ich eine LWT Meldung. Bei dem hier leider nicht, ist das ein Fehler meinerseits oder liegt es am Server?
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

betateilchen

die LWT gibt es in diesem Server auch. Mach mal ein "list <serverName>" dann siehst Du sie in den Internals unter "retain"
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

SamNitro

Ok da habe ich es gefunden, aber warum erstellt er unter dem eigentlichen Gerät kein eigenes Reading?
(Intel-Nuc Proxmox) (Homematic) (EnOcean) (CUL868) (CUL433) (Zigbee2MQTT) (ESP8266) (Echo) (DUOFERN)

rudolfkoenig

ZitatMQTT2_JSON() wünsche ich mir als Funktion json2reading() in fhem.pl und dazu noch CommandSetReadingFromHash()
Ich habe MQTT2_JSON als json2nameValue() nach fhem.pl kopiert, und da auch eine weitere Funktion json2reading implementiert, die mit dem has/Namen eines FHEM Geraetes und dem JSON aufgerufen werden muss. Ich habe MQTT2_JSON als Wrapper behalten, aber die Doku angepasst, d.h. MQTT2_JSON is deprecated. Achtung: json2nameValue ist _nicht_ die Umkehrfunktion zu toJSON, und soll es auch nicht sein.

ZitatDas deshalb die komplette Verbindung gedroped wird mag ein wenig hart sein.  :)
Na was sonst soll ich machen? Die andere Seite erwartet eine klare Antwort, wenn ich nichts antworte, dann beendet sie die Verbindung. Ich habe jetzt UNSUBSCRIBE implementiert, kann es aber nicht testen, da ich nicht weiss, womit. SAP ist bei mir in der Kategorie "Tage mit Installation von Programmen verbringen"

ZitatDa hat Rudi sich selbst ausgetrickst...
Das ist nicht zu leugnen. Habe mich von deinem Patch inspirieren lassen, und es hoffentlich gefixt.


ZitatGlobal symbol "$NAME" requires explicit package name at (eval 28) line
Das habe ich nirgendwo zugesagt. Ich habe es jetzt an 4 Stellen eingebaut, allerdings nur oeberflaechlich getestet. Feedback is welcome.

ZitatOk da habe ich es gefunden, aber warum erstellt er unter dem eigentlichen Gerät kein eigenes Reading?
Weil die Geraete, wo LWT gespeichert wird, temporaer sind. MQTT2_DEVICE entspricht nicht 1:1 einer Verbindung zu MQTT2_SERVER. Das kann man zwar so konfigurieren, muss man aber nicht.

ThoTo

Vielen Dank Rudi erstmal für die beiden Module, top!!!

Zitat von: rudolfkoenig am 14 August 2018, 22:16:07
Das habe ich nirgendwo zugesagt. Ich habe es jetzt an 4 Stellen eingebaut, allerdings nur oeberflaechlich getestet. Feedback is welcome.

Ich war am Holzweg und du zu schnell  :-[
Mea culpa!

Meine Idee war über ein User-Attribut "DeviceTopic" einen Teil des MQTT Topic vorzugeben und diesen dann für get,set,reading zu verwenden.
Mit AttrVal($NAME,....) ist das aber zu umständlich und spätestens bei den Readings klappt es nicht mehr.

Ich habe dann für mich testweise das Modul so umgeschrieben, dass es in getList/setList/readingList %TOPIC% durch den Wert des Attributes DeviceTopic ersetzt.
So sieht es dann für ein Sonoff/Tasmota-Device aus:
defmod HAUS.SONF.Steckdose MQTT2_DEVICE
attr HAUS.SONF.Steckdose DeviceTopic Sonoff-123456
attr HAUS.SONF.Steckdose IODev MQTTBroker
attr HAUS.SONF.Steckdose readingList tele/%TOPIC%/STATE:.* { MQTT2_JSON($EVENT) }\
stat/%TOPIC%/STATUS5:.* { MQTT2_JSON($EVENT) }\
stat/%TOPIC%/POWER:.* state\
tele/%TOPIC%/LWT:.* presence
attr HAUS.SONF.Steckdose setList on cmnd/%TOPIC%/POWER on\
off cmnd/%TOPIC%/POWER off\
statusRequest cmnd/%TOPIC%/Status 5


Würde es begrüssen wenn du das einbauen könntest, meinen Patch poste ich dann gerne.

LG Thomas
KNX | MQTT | Docker | Sonos | FHEMapp

"Zwei Dinge sind unendlich, das Universum und die menschliche Dummheit, aber bei dem Universum bin ich mir noch nicht ganz sicher." (Albert Einstein)