Läuft: zigbee2mqtt mit MQTT2_SERVER und MQTT2_DEVICE

Begonnen von supernova1963, 23 September 2018, 19:17:21

Vorheriges Thema - Nächstes Thema

Papaloewe

Ein publish im MQTT2-Server erzeugt immer eine doppelte Meldung im zigbee2mqtt.

Beispiel:
set xxx publish zigbee2mqtt/0x0017880100111162/set {"state": "OFF"}

erzeugt:
Dez 07 19:44:38 nuc npm[3182]:   zigbee2mqtt:info 2018-12-7 19:44:38 MQTT publish, topic: 'zigbee2mqtt/0x0017880100111162', payload: '{"state":"OFF","brightness":254,"color":{"x":0.148,"y":0.187}}'
Dez 07 19:44:38 nuc npm[3182]:   zigbee2mqtt:info 2018-12-7 19:44:38 MQTT publish, topic: 'zigbee2mqtt/0x0017880100111162', payload: '{"state":"OFF","brightness":254,"color":{"x":0.148,"y":0.187}}'


Sendet jetzt MQTT2 den publish zweimal, oder zeigt das andere Ende nur doppelt an?

rudolfkoenig

Kannst du bitte die Ausgabe von
list TYPE=MQTT2_SERVER subscriptionshier anhaengen?

Ich vermute, dass zigbee2mqtt das gleiche Topic doppelt abonniert, deswegen bekommt sie die Nachricht doppelt.
Ich habe MQTT2_SERVER angepasst, dass in solchen Faellen nur einmal gesendet wird.

Papaloewe

Gerne doch:
MQTT2_FHEM_Server_127.0.0.1_58436     zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.2157 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21563 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21556 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21549 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21543 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21536 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21529 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21521 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21515 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21508 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21501 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.2149 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21034 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21024 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.21015 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.21006 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/get=1544206741.20997 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/+/set=1544206741.20987 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/get=1544206741.20977 zigbee2mqtt/+/+/+/+/+/+/+/+/+/+/set=1544206741.20968 zigbee2mqtt/+/+/+/+/+/+/+/+/+/get=1544206741.20958 zigbee2mqtt/+/+/+/+/+/+/+/+/+/set=1544206741.20948 zigbee2mqtt/+/+/+/+/+/+/+/+/get=1544206741.20938 zigbee2mqtt/+/+/+/+/+/+/+/+/set=1544206741.20928 zigbee2mqtt/+/+/+/+/+/+/+/get=1544206741.20918 zigbee2mqtt/+/+/+/+/+/+/+/set=1544206741.20908 zigbee2mqtt/+/+/+/+/+/+/get=1544206741.20896 zigbee2mqtt/+/+/+/+/+/+/set=1544206741.20887 zigbee2mqtt/+/+/+/+/+/get=1544206741.20877 zigbee2mqtt/+/+/+/+/+/set=1544206741.20862 zigbee2mqtt/+/+/+/+/get=1544206741.20848 zigbee2mqtt/+/+/+/+/set=1544206741.20833 zigbee2mqtt/+/+/+/get=1544206741.20822 zigbee2mqtt/+/+/+/set=1544206741.20803 zigbee2mqtt/+/+/get=1544206741.20491 zigbee2mqtt/+/+/set=1544206741.20483 zigbee2mqtt/+/get=1544206741.20475 zigbee2mqtt/+/set=1544206741.20466 zigbee2mqtt/bridge/config/+=1544206741.20445 zigbee2mqtt/bridge/networkmap=1544206741.21576
MQTT2_FHEM_Server_192.168.0.136_11563     cmnd/DVES_1D753D/#=1544206575.52731 gosund-5437/cmnd/#=1544206575.52699 sonoffs/cmnd/#=1544206575.52721

maclovlin

Abend,

in der mqtt2.template ist aktuell ein Typo drin, es wird deshalb das Attribut "setList" bei "colorbulbWithoutColorTemp"-Template nicht gesetzt.
Zeile 57:94,  ist ne Klammer zuviel.

rudolfkoenig

Zitatin der mqtt2.template ist aktuell ein Typo drin, es wird deshalb das Attribut "setList" bei "colorbulbWithoutColorTemp"-Template nicht gesetzt.
Danke fuer den Hinweis, habe gestern schon gefixt, siehe
https://forum.fhem.de/index.php/topic,90145.msg869098.html#msg869098

@Papaloewe: meiner Ansicht nach ist zigbee2mqtt meshugge, jedenfalls was subscriptions angeht. Statt jeweils 19 Subscriptions mit variablen Anzahl von + fuer get und set wuerde ich jeweils nur eine mit einem # verwenden. So in der Art, wie sonoff (zweite Zeile) das macht. Bei dem Praefix reicht eigentlich auch nur eine Einzige: zigbee2mqtt/#

Beta-User

So, das ganze mit den aktuellen Dateien (update-Stand von heute morgen) nochmal durchexerziert: (Fast) alles bestens :) ! Keine Neustarts erforderlich.

Das einzige, was man wissen muss, ist dass man sich für die Lampen eben die ID's aufschreiben sollte, bevor man das Bridge-template anwendet ;) . Dann muß man den zu publishenden command einmal händisch zusammenklauben und den MQTT2_SERVER das schicken lassen, that's all.

Werde das Wiki demnächst noch updaten, anbei aber mal noch die aktuellen template-Definitionen. Da sind kleine Modifikationen gg. dem allgemeinen Stand drin, die m.E. sinvoll sind:

###########################################
# zigbee2mqtt
# The zigbee2mqtt bridge device
name:zigbee2mqtt_bridge
filter:TYPE=MQTT2_DEVICE
attr DEVICE bridgeRegexp zigbee2mqtt/0x([A-Za-z0-9]*)[/]?.*:.* "zigbee_$1"
attr DEVICE setList\
  permit_join:true,false zigbee2mqtt/bridge/config/permit_join $EVTPART1\
  remove:textField zigbee2mqtt/bridge/config/remove $EVTPART1\
  log_level:debug,info,warn,error zigbee2mqtt/bridge/config/log_level $EVTPART1\
  rename:textField zigbee2mqtt/bridge/config/rename  {"old":"$EVTPART1","new":"$EVTPART2"}\
  network_map:raw,graphviz zigbee2mqtt/bridge/networkmap  $EVTPART1\
  devicelist:noArg zigbee2mqtt/bridge/config/devices


# A dimmable light connected via zigbee2mqtt
name:zigbee2mqtt_bulb
filter:TYPE=MQTT2_DEVICE
par:NAMEINTHEBRIDGE;name of this device in the bridge;{ AttrVal("DEVICE","readingList","") =~ m,zigbee2mqtt/(.*):, ? $1 : undef }
attr DEVICE icon light_control
attr DEVICE devStateIcon {zigbee2mqtt_devStateIcon255($name)}
attr DEVICE webCmd toggle:on:off:brightness
attr DEVICE setList \
  on:noArg zigbee2mqtt/NAMEINTHEBRIDGE/set {"state":"ON"}\
  off:noArg zigbee2mqtt/NAMEINTHEBRIDGE/set {"state":"OFF"}\
  brightness:colorpicker,BRI,0,15,255 zigbee2mqtt/NAMEINTHEBRIDGE/set {"state":"on","$EVTPART0":"$EVTPART1"}

Was ich persönlich noch ändern würde/werde, wäre "toggle:on:off:" wieder zu entfernen. Das ist m.E. nicht nötig, wenn man das devStateIcon nutzt: das zeigt doch schon an, ob bzw. sogar wie sehr die Lampe an oder aus ist und toggelt dann beim draufdrücken... Ist aber eine Geschmacksfrage, daher habe ich das erst mal drin gelassen.

Da ich keine color_temp-Lampen habe, denke ich zwar, dass das devStateIcon (statt der erweiterten webCmd-Angabe) da auch sinnvoll wäre, aber evtl. kann das ja jemand bestätigen, der sowas hat und getesteten Komplett-Code posten?

Schönes WE noch,
Beta-User
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

maclovlin

#186
hmm, bei mir läuft seit dem Update von heute morgen anscheinen die Kommunikaton mqtt2_bridge -> zigbee2mqtt nicht.
zigbee2mqtt -> mqtt2_bridge funktioniert dagegen tadellos, devices werden angelegt etc.

Die Publishes tauchen auch nicht im zigbee2mqtt Log auf...

--------- Update -----------
Ich glaube, es liegt am client/bridge.
Dieser wurde zwar automatisch angelegt, aber die Publishes dringen nicht durch...

Papaloewe

Ja, mit dem letzten MQTT2_Server Update geht das publish scheinbar nicht mehr.

maclovlin

#188
Ich habe keine Ahnung von Perl, aber das "last;" in Zeile 448 in "00_MQTT2_SERVER.pm"
gehört ne Zeile höher, sonst ist die Schleife nach einem durchgang schon fertig.

Siehe unten.

Bei mir läufts damit wieder einwandfrei  :)


######################################
# send topic to client if its subscription matches the topic
sub
MQTT2_SERVER_sendto($$$$)
{
  my ($shash, $hash, $topic, $val) = @_;
  return if(IsDisabled($hash->{NAME}));
  $val = "" if(!defined($val));
  foreach my $s (keys %{$hash->{subscriptions}}) {
    my $re = $s;
    $re =~ s,/?#,\\b.*,g;
    $re =~ s,\+,\\b[^/]+\\b,g;
    if($topic =~ m/^$re$/) {
      Log3 $shash, 5, "$hash->{NAME} $hash->{cid} => $topic:$val";
      addToWritebuffer($hash,
        pack("C",0x30).
        MQTT2_SERVER_calcRemainingLength(2+length($topic)+length($val)).
        pack("n", length($topic)).
        $topic.$val);
      last;
    }
  }
}

Beta-User

Zitat von: maclovlin am 08 Dezember 2018, 20:58:46
Bei mir läufts damit wieder einwandfrei  :)
Danke!
Jedenfalls nach einem schnellen reload kann ich das vorläufig bestätigen!

Ansonsten: Wiki ist (im zigbee2mqtt-Teil) weitestgehend angepaßt auf die attrTemplate-Sache.
Schönheit folgt, aber mir war erst mal wichtig, dass der neue Weg einigermaßen nachvollziehbar drin ist und niemand mehr auf die kompliziertere Fährte gelockt wird.

Schönes WE zusammen!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

rudolfkoenig

Zitat"last;" in Zeile 448 in "00_MQTT2_SERVER.pm" gehört ne Zeile höher
Danke fuer den Hinweis, habs eingecheckt.

AttrTemplate Vorschlag fuer zigbee2mqtt: ich vermisse den Parameter. Ist bridge bei zigbee2mqtt immer fest? Wie kann man zwei Instanzen unterscheiden? Ich habe fuer zigbee2mqtt_bridge bridgeRegexp uebernommen, das BRIDGENAME Parameter in bridge umbenannt, und bei zigbee2mqtt_bulb devStateIcon uebernommen.

Generell: macht mir bitte die Arbeit einfacher, indem ihr ein diff (diff -u alte_datei neue_datei) schickt.

Zitat"toggle:on:off:" wieder zu entfernen.
Das habe ich gerade eingebaut, weil in dem anderen Thema danach gefragt wurde.
Ich wuerde es gerne drinlassen, weil fuer Neulinge einfacher ist, etwas zu entfernen, als etwas dazuzubauen.

maclovlin

#191
Zitat von: Beta-User am 09 Dezember 2018, 10:55:00
Ansonsten: Wiki ist (im zigbee2mqtt-Teil) weitestgehend angepaßt auf die attrTemplate-Sache.

Danke auch!  :)

Da meine Ikea Color Lampe mit der originalen zigbee2mqtt_RGB2JSON($) Funktion öfters in einem undefinierten Zustand geschaltet wurde ( Lampe blinkt mehrmals und nimmt einen komischer blauer farbton an), wenn ich die Farbe über den Colorpicker ausgewählt habe, habe ich die RGB zu CIA konverter Funktion von hier portiert https://github.com/usolved/cie-rgb-converter/.

Damit gelingen bei mir jetzt butterweiche Farbübergänge die ich über den Colorpicker auswähle.

@rudolfkoenig:
Vielleicht kannst du einen Blick drauf werfen. Es kann sein das einiges schöner und kompakter geschrieben werden kann.

Speziell die überprüfung auf NaN, da bin ich mir nicht sicher ob es so Perl konform ist.

Habe wie gesagt nicht die nötige Erfahrung mit Perl und einige "spezialitäten" wie $1, kommen mir wie schwarze Magie vor  ;).


sub
zigbee2mqtt_RGB2JSON($)
{
  # Color converter Code taken from
  # https://github.com/usolved/cie-rgb-converter/
  my $hexColor = shift(@_);
  if($hexColor =~ m/^(..)(..)(..)/){
    my ($r, $g, $b) = (hex($1), hex($2), hex($3));

    # Apply a gamma correction to the RGB values, which makes the color more
    # vivid and more the like the color displayed on the screen of your device
    $r = $r > 0.04045 ? (($r+0.055) / (1.0 + 0.055))**2.4: ($r/12.92);
    $g = $g > 0.04045 ? (($g+0.055) / (1.0 + 0.055))**2.4: ($g/12.92);
    $b = $b > 0.04045 ? (($b+0.055) / (1.0 + 0.055))**2.4: ($b/12.92);

    # RGB values to XYZ using the Wide RGB D65 conversion formula
    my $X = $r * 0.664511 + $g * 0.154324 + $b * 0.162028;
    my $Y = $r * 0.283881 + $g * 0.668433 + $b * 0.047685;
    my $Z = $r * 0.000088 + $g * 0.072310 + $b * 0.986039;

    # Calculate the xy values from the XYZ values
    my $x = sprintf("%.4f",($X / ($X + $Y + $Z)));
    my $y = sprintf("%.4f",($Y / ($X + $Y + $Z)));

    if($x eq 'nan') {
      $x = 0;
    }

    if($y eq 'nan') {
      $y = 0;
    }

    my %color_hash = (x => $x, y => $y);
    my %set_hash = ('transition' => 1, 'color' => \%color_hash);

    return toJSON(\%set_hash);
  }
}


Vielen Dank für die gute Arbeit an alle!


--- Update ---
Soo, nachdem ich mich jetzt etwas mehr mit zigbee2mqtt beschäftigt habe, sehe ich das die obige Funktion eigentlich humbug ist.
Man kann die RGB Werte direkt an zigbee2mqtt senden, was dir originale zigbee2mqtt_RGB2JSON Funktion auch tut.
Die Frage ist, warum funktioniert es bei mir nicht?

Soll ich die Funktion aus dem Thread entfernen?

--- Update ---
Anscheinend reicht es aus die originale Funktion wie folgt abzuändern damit der Farbwechsel klappt:


sub
zigbee2mqtt_RGB2JSON($)
{
  my $rgb = shift(@_);
  $rgb =~ m/^(..)(..)(..)/;
  print $rgb;
  my( $r, $g, $b ) = (hex($1), hex($2), hex($3));
  my %color_hash = (r => $r, g => $g, b => $b);
  my %set_hash = ('transition' => 1, 'color' => \%color_hash);
  print %color_hash;
  return toJSON(\%set_hash);
}


Kann sich jemand dazu äussern?

rudolfkoenig

@maclovin:
Version1:
- macht eine gamma Korrektur. Ob das in FHEM an dieser Stelle richtig ist, wage ich zu bezweifeln.
- die rgb Werte beim Eingang sind ganzzahlig im Bereich 0..255. Diese auf 0.04045 zu vergleichen ist ...sinnlos.
- ich habe es nicht geschafft, sprintf zu nan zu ueberreden: bei Problemen gibt es ein WARNING im fhem-log, und es wird 0 zurueckgeliefert.

Version2 liefert Werte von 0 bis 255, in der eingecheckten Version von 0 bis 1 (als Fliesskomma). Ich kann nicht beurteilen, was korrekt ist.

Beta-User

Zitat von: rudolfkoenig am 09 Dezember 2018, 11:40:27
AttrTemplate Vorschlag fuer zigbee2mqtt: ich vermisse den Parameter. Ist bridge bei zigbee2mqtt immer fest?
Wie kann man zwei Instanzen unterscheiden? Ich habe fuer zigbee2mqtt_bridge bridgeRegexp uebernommen, das BRIDGENAME Parameter in bridge umbenannt, und bei zigbee2mqtt_bulb devStateIcon uebernommen.
Danke; wenn man das parametrieren will, muß man - wie bereits vermutet - die Angabe "zigbee2mqtt" ändern, also den allerersten Teil des Topic-Strings. In der yaml findet sich das so:
base_topic: zigbee2mqttBei Gelegenheit versuche ich das noch wie gewünscht zu parametrisieren, ist aber m.E. nicht eilig (und ich brauche dafür mehr Zeit wie ein Perl/Regex-Experte).

ZitatGenerell: macht mir bitte die Arbeit einfacher, indem ihr ein diff (diff -u alte_datei neue_datei) schickt.
Sorry, war heute morgen sehr eilig...

ZitatDas habe ich gerade eingebaut, weil in dem anderen Thema danach gefragt wurde.Ich wuerde es gerne drinlassen, weil fuer Neulinge einfacher ist, etwas zu entfernen, als etwas dazuzubauen.
Ich nehme dazu einen Hinweis ins Wiki, dass man das gefahrlos verkürzen kann, das Argument ist ansonsten nachvollziehbar (deswegen war es auch im template-Vorschlag noch drin). (Ansonsten gehe ich davon aus, dass die Vorschlagenden im anderen Thread nicht wußten, dass man über das Icon toggeln kann, aber egal).

Danke auch von meiner Seite für die eine oder andere Lehrstunde und die prompte Reaktion auf Probleme!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

maclovlin

#194
Zitat von: rudolfkoenig am 09 Dezember 2018, 18:09:26
@maclovin:
Version1:
- macht eine gamma Korrektur. Ob das in FHEM an dieser Stelle richtig ist, wage ich zu bezweifeln.
- die rgb Werte beim Eingang sind ganzzahlig im Bereich 0..255. Diese auf 0.04045 zu vergleichen ist ...sinnlos.
- ich habe es nicht geschafft, sprintf zu nan zu ueberreden: bei Problemen gibt es ein WARNING im fhem-log, und es wird 0 zurueckgeliefert.

Version2 liefert Werte von 0 bis 255, in der eingecheckten Version von 0 bis 1 (als Fliesskomma). Ich kann nicht beurteilen, was korrekt ist.

Wie bereits geschrieben, ist die Version1 humbug und unnötig und sollte nicht verwendet werden, da die Umwandlung
ja schon durch zigbee2mqtt gemacht wird. Habs zu spät gesehen...

Ich denke Werte von 0-255 werden richtig sein.
Siehe dazu: https://github.com/Koenkk/zigbee2mqtt/wiki/MQTT-topics-and-message-structure#zigbee2mqttdevice_idset

Hab noch was vergessen...
Wie komme ich eigentlich, nachdem ich z.B Blau eingestellt habe, wieder zurück auf den "normalen" Farbton zurück?
Also den Farbton, den die Lampe beim einschalten hat.
FFFFFF wäre zu einfach gewesen... :)