[Bugs] 00_MQTT2_SERVER / 10_MQTT2_DEVICE

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

Vorheriges Thema - Nächstes Thema

betateilchen


Index: 00_MQTT2_SERVER.pm
===================================================================
--- 00_MQTT2_SERVER.pm  (Revision 17119)
+++ 00_MQTT2_SERVER.pm  (Arbeitskopie)
@@ -72,7 +72,7 @@
{
   my ($hash) = @_;
   my $now = gettimeofday();
-  foreach my $clName (keys $hash->{clients}) {
+  foreach my $clName (keys %{$hash->{clients}}) {
     my $cHash = $defs{$clName};
     next if(!$cHash || !$cHash->{keepalive} ||
              $now < $cHash->{lastMsgTime}+$cHash->{keepalive}*1.5 );
@@ -335,7 +335,7 @@
     $hash->{retain}{$tp} = \%h;
   }

-  foreach my $clName (keys $hash->{clients}) {
+  foreach my $clName (keys %{$hash->{clients}}) {
     MQTT2_SERVER_sendto($defs{$clName}, $tp, $val) if(!$src || $src ne $clName);
   }

@@ -353,7 +353,7 @@
   my ($hash, $topic, $val) = @_;
   return if(IsDisabled($hash->{NAME}));
   $val = "" if(!defined($val));
-  foreach my $s (keys $hash->{subscriptions}) {
+  foreach my $s (keys %{$hash->{subscriptions}}) {
     my $re = $s;
     $re =~ s,/?#,\\b.*,g;
     $re =~ s,\+,\\b[^/]+\\b,g;
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig


betateilchen

Zitat von: rudolfkoenig am 10 August 2018, 18:13:52
Haengt vom Perl version wohl ab, 5.18 meldet keine Fehler, 5.26 mag tatsaechlich nicht.

Naja, das Problem mit dieser Fehlermeldung diskutieren wir hier im Forum schon seit ca. 3 Jahren... (ich glaube, seit perl 5.24)




funktioniert:


readingList
obi/tele/08/STATE.* { MQTT2_JSON($EVENT) }


funktioniert nicht:


readingList
obi/tele/08/STATE { MQTT2_JSON($EVENT) }





In der commandref zum Server steht noch

Zitatdefine <name> MQTT2_SERVER <tcp-portnr> [global|IP]

Enable the server on port <tcp-portnr>. If global is specified, then requests from all interfaces (not only localhost / 127.0.0.1) are serviced. If IP is specified, then FHEMWEB will only listen on this IP.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#3

2018.08.10 18:58:08 5: m2s: dispatch obi/tele/08/STATE:{"Time":"2018-08-10T17:58:08","Uptime":"0T00:42:57","Vcc":3.274,"POWER":"off","Wifi":{"AP":1,"SSId":"mowg","RSSI":100,"APMac":"CC:CE:1E:EA:A3:60"}}
2018.08.10 18:58:08 1: ERROR: empty name in readingsBeginUpdate
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBeginUpdate           called by ./FHEM/10_MQTT2_DEVICE.pm (87)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Time,2018-08-10T17:58:08) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Wifi_SSId,mowg) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Uptime,0T00:42:57) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Vcc,3.274) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Wifi_APMac,CC:CE:1E:EA:A3:60) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Wifi_AP,1) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,POWER,off) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: readingsUpdate(,Wifi_RSSI,100) missed to call readingsBeginUpdate first.
2018.08.10 18:58:08 1: stacktrace:
2018.08.10 18:58:08 1:     main::readingsBulkUpdate            called by ./FHEM/10_MQTT2_DEVICE.pm (89)
2018.08.10 18:58:08 1:     main::MQTT2_DEVICE_Parse            called by fhem.pl (3783)
2018.08.10 18:58:08 1:     main::Dispatch                      called by ./FHEM/00_MQTT2_SERVER.pm (342)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_doPublish        called by ./FHEM/00_MQTT2_SERVER.pm (279)
2018.08.10 18:58:08 1:     main::MQTT2_SERVER_Read             called by fhem.pl (3587)
2018.08.10 18:58:08 1:     main::CallFn                        called by fhem.pl (723)
2018.08.10 18:58:08 1: ERROR: >mqtt_test< returned by the MQTT2_DEVICE ParseFn is invalid, notify the module maintainer


Ich habe den Verdacht, dass Änderungen an readingList und am device selbst (z.B. Löschen eines devices und späteres Neuanlegen mit gleichem Namen, aber anderer readingList) nicht richtig verarbeitet werden.




Es ist mir nun gelungen, eine umgeflashte Obi Steckdose in FHEM zu integrieren, allerdings - rein gefühlsmässig - ist die Reaktionszeit mit den neuen Modulen hier im lokalen Netzwerk langsamer als über einen mosquitto Server bei Amazon in Irland.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Ist es eigentlich Absicht, dass das DEVICE Modul auch die 00_ am Anfang trägt?

äh... vergiss es :)

Du solltest aber den Eintrag in der MAINTAINER.txt für MQTT2_DEVICE korrigieren - da steht tatsächlich 00_MQTT2_DEVICE und wird deshalb auch in "help" so angezeigt. Das hatte mich irritiert.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Danke fuer die Hinweise.
- MAINTAINER: korrigiert
- Doku fuer readingsList korrigiert, obi/tele/08/STATE.* ist richtig (sollte analog zu notify topic:message matchen)
- Doku fuer define MQTT2_SERVER korrigiert.
- delete Bug gefixt
- rename Bug gefixt (das habe ich selbst gefunden :) )

betateilchen

Zitat von: rudolfkoenig am 10 August 2018, 21:43:47
- Doku fuer readingsList korrigiert,

nur der Klarheit halber: readingList, ohne "s" in der Mitte (in der Doku steht es richtig)




Vorgestern habe ich mir extra noch einen lokalen mosquitto aufgesetzt, weil meine Steckdosen nicht ins Internet brauchen (und auch nicht kommen). Hätte ich gewusst, dass FHEM das ab heute selbst kann, hätte ich mir die Arbeit sparen können  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#7
für MQTT2_SERVER habe ich zwei Wünsche:


  • ein reading "state" und readingFnAttributes anstatt hartcodiertem STATE (wo wird das eigentlich gesetzt ?)*
  • ein reading mit der Anzahl verbundener clients

Edit:

* gefunden: STATE kommt aus TcpServerUtils.pm
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rudolfkoenig

Habe TcpServerUtils modifiziert, setze da state mit readingsSingleUpdate, allerdings ohne trigger. Bin auf Nebeneffekte gespannt.
In MQTT2_SERVER gibts jetzt ein NRCLIENTS.

Falls irgendwer bei SSL/TLS helfen will, wuerde ich mich freuen: in MQTT2_SERVER ist zwar TLS mit dem SSL Attribut aktivierbar, aber ich habe mit mosquitto_pub noch keine Verbindung herstellen koennen, und weiss nicht genau, wo das Problem liegt, ausser "es geht nicht".
Habe weiterhin FD in FileLog und global (fuer logfile) eingebaut, damit "list .* FD" bessere Daten liefert.

betateilchen

Zitat von: rudolfkoenig am 11 August 2018, 09:01:43
In MQTT2_SERVER gibts jetzt ein NRCLIENTS.

Ja, aber als zusätzliches internal und nicht als reading. Das hilft mir nicht weiter :(

Szenario: Es geht darum, auf die Änderung der Anzahl ein notify triggern zu können, insbesondere für monitoring-Zwecke.
Beispiel: Wenn ich weiß, dass es 7 Steckdosen gibt und die Anzahl plötzlich auf 6 sinkt, weiss, ich dass etwas nicht stimmt.

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

Danke.

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

Billy

Frage, läuft 00_MQTT2_SERVER

auch mit 10_MQTT_BRIDGE.pm oder 10_MQTT_GENERIC_BRIDGE.pm?

Gruß 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*

betateilchen

Versuch macht kluch... aber ich würde mal auf "nein" tippen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hexenmeister

Wird nicht funktionieren. Die bisherigen Module sind sehr eng miteinander gekoppelt.
Die GenericBrigde ist von mir. Ich muss mir die neuen ansehen, evtl kann ich eine entsprechende Anpassung für die neuen Module erstellen.
Maintainer: MQTT_GENERIC_BRIDGE, SYSMON, SMARTMON, systemd_watchdog, MQTT, MQTT_DEVICE, MQTT_BRIDGE
Contrib: dev_proxy

Billy

#13
Ich finde gut, dass das MQTT Thema jetzt in FHEM an Fahrt gewinnt!

Eine Bereinigung wäre für Neueinsteiger sicher sinnvoll.

Wenn ich das richtig verstanden habe ist "00_MQTT2_SERVER / 10_MQTT2_DEVICE"
nicht mit den bisherigen Bridges (10_MQTT_BRIDGE.pm oder 10_MQTT_GENERIC_BRIDGE.pm) verwendbar? schade  :-\

Eine MQTT2_GENERIC_BRIDGE.pm wäre dann die Lösung. ;)

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*

betateilchen

Zitat von: Billy am 11 August 2018, 17:04:36
Eine MQTT2_GENERIC_BRIDGE.pm wäre dann die Lösung. ;)

ich glaube man braucht das gar nicht, weil sich das meiste per notify lösen lässt :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!