Merten Funk-Rolladentaster Connect (5025, 5035, 5045) modelConfig: unknown

Begonnen von HomeAlone, 03 Juni 2015, 18:13:21

Vorheriges Thema - Nächstes Thema

krikan

Prima! Zumindest ein Erfolg. Jetzt sollten wir doch überlegen, dass Command in 10_Zwave.pm einzubauen. Dann lässt sich leichter testen.
Zitat
Ich würde jetzt mal halblaut behaupten, dass das Device richtig eingerichtet ist.
Zweifel auch nicht an Deiner Einrichtung, sondern sehe das Problem in den Merten-Besonderheiten, die irgendwelche Abweichungen von den mir bekannten Standards darstellen.

ZitatBeim Drücken auf on oder off in der fhem GUI für den Merten-Taster fährt die Rollade ja auch hoch und runter.
Das nutzt die Pflichtklasse CC BASIC, wenn das nicht funktionieren würde, hätten wir gar nicht weiterforschen brauchen.

ZitatIch hab jetzt einfach mal einen Fibaro FGRM222 bestellt. Der soll laut Doku ja auch mit Schaltern, die einen Schalter für rauf und einen für runter haben (das ist hier standardmäßig verbaut worden) verwendbar sein. Vielleicht bekomme ich ja mehr heraus, wenn ich den angeschlossen habe (z.B. ob ich nicht vielleicht doch einen Fehler in meiner config habe).
Betreibe den ohne Taster, kann dazu also nichts schreiben. Fehler s.o.: Vermutlich nein.

ZitatNichts desto trotz, möchte ich natürlich den Merten-Taster auch dazu bekommen, den dim % (oder ein Äquivalent dazu) hinzubekommen.
Fände ich auch toll, aber hoffentlich ist der Weg nicht mehr allzu steinig ;).
Ich frage mich immer noch, warum zway 3 Devices für Merten hat..

krikan

Stolpere gerade über einen weiteren "Stein" (Fels?)
Hat Dein Merten-Aktor wirklich nur SWITCH_MULTILEVEL Version 1?
Dann befürchte ich, dass "Switch Multilevel Start Level Change"  Dir nicht wirklich viel hilft, da das Command keine Laufzeit akzeptiert. Das startet nur das Hoch- und Runterfahren und Du musst bei der gewünschten Position mit "set <device> stop" anhalten. Ein gezieltes Anfahren, wie über "dim %" ist dann mMn nur mit Rechnen über Perl-Code möglich. Hoffe meine Befürchtung ist falsch.
Evtl. kannst Du den gleichen Effekt jetzt schon mit "set <device> on/off", Perl-Code und "set <device> stop" erreichen, ohne etwas einbauen zu müssen.

HomeAlone

Ja, ist anscheinend nur V1:


get wz_Rollade_rechts versionClass 38


gibt zurück:
versionClass_26:01 .

Hm, das ist natürlich blöd. BASIC_WINDOW_COVERING wäre ja in V2 verfügbar - aber da weiß keiner was V2 kann. Oder hast Du noch eine Idee, wie man das mit BASIC_WINDOW_COVERING V2 versuchen könnte?

Alternativ hört sich Perl auch OK an.
Habe gerade hier gelesen: http://www.fhemwiki.de/wiki/99_myUtils_anlegen und das hört sich nicht zu kompliziert an.

krikan

ZitatJa, ist anscheinend nur V1:
Nicht gut, mir fehlen dann auch nach dem xten Lesen der bekannten Infos zu V1 stichhaltige Ideen es umzusetzen.

ZitatOder hast Du noch eine Idee, wie man das mit BASIC_WINDOW_COVERING V2 versuchen könnte?
Nein leider auch nicht.

ZitatAlternativ hört sich Perl auch OK an.
Kannst ja erst mal mit Kombinationen von on/off, http://fhem.de/commandref.html#sleep und stop experimentieren. Vielleicht reicht Dir das so schon.


HomeAlone

OK, meine Funktion ist soweit, dass ich sie gerne einmal testen würde. Leider scheitere ich am Aufruf der Funktion :(

Der Funktionsheader sieht wie folgt aus:
sub Merten_dim($$$) {
  my ($startlevel, $endlevel, $device) = @_;
  ...

Und aus Sicherheitsgründen wollte ich die berechneten Werte erst einmal nur ausgeben:

...
    {Log 1, "Direction: $direction"};
    {Log 1, "DiffSeconds: $diffseconds"};
...


Jetzt würde ich das Ganze gerne aus dem Webfrontend aufrufen.
Dazu würde ich gerne einen Slider im Webfrontend anlegen, der von 0 - 99 (wie die dim Funktion) Werte annehmen kann.

Das klappt:

define MertenDimmer dummy
attr MertenDimmer room Wohnzimmer
attr MertenDimmer webCmd state
attr MertenDimmer setList state:slider,0,1,99


Der Slider gibt ja zunächst den startlevel an. Wenn ich ihn bewege, gibt er den endlevel an (nachdem ich auf set klicke).

-> Kann ich an dieser Stelle beide Werte abrufen? Also den Wert, der zuvor dort war und den, den ich neu eingestellt habe?

Ich habe verstanden, dass das Aufrufen der Funktion über notify funktionieren soll, bekomme aber die Syntax nicht hin.
Ich habe es erst mal mit fixen Werten versucht:

define MyNotifyMerten notify MertenDimmer:state {Merten_dim(0,50,"wz_Rollade_rechts")}


Gibt keine Fehlermeldung - es passiert aber auch nichts (es wird nichts geloggt). Vermutlich ist hier irgendwas nicht ganz korrekt...?

Hat jemand einen kurzen Tipp, wie ich es mache, dass ich beim Klicken auf set die Funktion Merten_dim($startlevel, $endlevel, <current device name>) aufrufe?

Viele Grüße,
Sascha

krikan

Mache mal in einem 2. Browserfenster einen EventMonitor auf und löse mal Deinen slider per set aus, dann siehst Du Dein Event/regexp für notify und kannst das korrigieren: http://www.fhemwiki.de/wiki/Notify

Schau Dir auch mal unter http://fhem.de/commandref.html#perl OldValue("device") an.

HomeAlone

Ich habe es hinbekommen. :) Obwohl ich aus der Ausgabe des EventMonitors und der Beschreibung von notify nicht schlau geworden bin. Was dann half war wildes Ausprobieren, bis ich mich dann endlich der eigentlichen Aufgabe dem Codestück widmen konnte.  :o Die Hinweise zu OldValue() waren Gold wert. :)

Im EventMonitor wird folgendes geloggt, wenn ich den Slider verschiebe:

2015-07-08 19:06:30 dummy MertenDimmer 47


Nach Rumspielen mit addRegexpPart kam heraus, dass es MertenDimmer:.* heißen muss... Dann wird die Funktion auch aufgerufen.

Hier die (aktuelle noch nicht 100% fertige) Funktion, welche ich in 99_myUtils.pm eingetragen habe:

sub Merten_dim($$$) {
  my ($startlevel, $endlevel, $device) = @_;
  my $functionname = (caller(0))[3] . ": "; # helpful for logging
 
  ################################################################
  # Do not edit anything above here!!!
  #define how long your roller shutters need to drive up and down
  my $debug = 1; #used to troubleshoot
  my $downseconds = 27; # time your roller shutter needs to drive down
  my $upseconds = 27; # time your roller shutter needs to drive up
    # Do not edit anything below here!!!
  ################################################################
 
  my $seconds = 0; # seconds to move from start to end position
  my $diffseconds = 0; # seconds to move to end position

  if ($debug == 1) {
  {Log 1, $functionname . "startlevel : " . $startlevel};
  {Log 1, $functionname . "endlevel   : " . $endlevel};
  {Log 1, $functionname . "device     : " . $device};
  # we need to save the state within the Merten Switch later...
    # of no real functionality right now
    {Log 1, $functionname . "oldvalue   : " . OldValue("$device")};
  {Log 1, $functionname . "value      : " . Value("$device")};
  {Log 1, $functionname . "dimlevel   : " . ReadingsVal("$device","dim",0)}
  }
 
  # check for invalid parameters
  my $direction = "";

  if ($startlevel < 0 || $startlevel > 99) {
    {Log 1, $functionname . "Invalid startlevel: ($startlevel) - doing nothing"};
    return;
  }

  if ($endlevel < 0 || $endlevel > 99) {
    {Log 1, $functionname . "Invalid endlevel: ($endlevel) - doing nothing"};
    return;
  }
 
  if ($startlevel == $endlevel) {
{Log 1, $functionname . "startlevel ($startlevel) = endlevel ($endlevel) - doing nothing"};
    return;
  }
 
  # special conditions: fully open or close
  if ($endlevel == 0) {
    fhem( "set $device coveringOpen" );
    return;
  }
 
  if ($endlevel == 99) {
    fhem( "set $device coveringClose" );
    return;
  }
 
  # here we go for the dimming part
  my $difflevel = 0;
 
  if ($startlevel > $endlevel) {
    $direction = "coveringOpen";
    $seconds = $downseconds;
  }
  else {
    $direction = "coveringClose";
    $seconds = $upseconds;
  }

  $difflevel = abs ($startlevel - $endlevel);
  $diffseconds = int ((($seconds / 99) * $difflevel) + 0.5);

  fhem( "set $device $direction" );
  sleep $diffseconds;
  fhem( "set $device coveringStop" );
#  fhem( "setreading $device dim $endlevel");
 
  if ($debug == 1) {
    {Log 1, $functionname . "Direction  : $direction"};
    {Log 1, $functionname . "DiffSeconds: $diffseconds"};
  }
}


Wer es einmal ausprobieren möchte: Zunächst die Zeit stoppen, die Eure Rolladen für eine komplette Hochfahrt und eine komplette Runterfahrt benötigen.
Diese Werte im Code eintragen:


  my $downseconds = 27; # time your roller shutter needs to drive down
  my $upseconds = 27; # time your roller shutter needs to drive up


Die Funktion natürlich vorher in die 99_myUtils.pm einfügen :)

Aufgerufen wird sie über folgendes notify:

MertenDimmer:.* {Merten_dim(OldValue("MertenDimmer"),Value("MertenDimmer"),"wz_Rollade_rechts")}


Natürlich ist das noch nicht perfekt:

  • Die Werte werden noch nicht über einen Neustart hinaus gespeichert. Das sollte mit ReadingsVal() gehen.
  • Bei ganz kleinen Schritten kommt es zu Rundungsfehlern - also wenn ich immer in Einerschritten von 0 auf 1 auf 2 auf... gehe tut sich nix. Damit kann ich prinzipiell leben, da ich vermutlich nur 10% Schritte verwenden werde. Wenn hier aber jemand eine schlaue Lösung parat haben sollte, dann bau ich sie gerne ein.

Als nächstes werde ich mich dann an das Speichern der Werte über den Neustart machen. Vermutlich kann man dann auch den slider in einem Reading des Merten-Taster speichern, oder? Dann bräuchte ich das Hilfskonstrukt mit dem Webschalter nicht.


krikan

ZitatIch habe es hinbekommen.
:)
Zitat
Obwohl ich aus der Ausgabe des EventMonitors und der Beschreibung von notify nicht schlau geworden bin.
Du darfst auch nachfragen; hoffe aber es ist nun verständlich.

Was mir auffällt:
Du nutzt in sub Merten_dim Perl-sleep. Das stoppt Fhem für den sleep-Zeitraum. Du solltest Fhem-sleep passend nutzen, damit Fhem weiter arbeitet.

ZitatBei ganz kleinen Schritten kommt es zu Rundungsfehlern - also wenn ich immer in Einerschritten von 0 auf 1 auf 2 auf... gehe tut sich nix. Damit kann ich prinzipiell leben, da ich vermutlich nur 10% Schritte verwenden werde. Wenn hier aber jemand eine schlaue Lösung parat haben sollte, dann bau ich sie gerne ein.
Auch Aktoren mit Positionierungslogik haben immer Abweichungen. Also nichts worüber ich mich aufregen würde.

rudolfkoenig

Christian hat Recht, ich kriege verschobene Threads nicht mit.

Allerdings weiss ich nach durchlesen der Diskussion nicht, was ich machen soll.

Habe hoechstens fuer die Perl-Funktion ein paar Tipps:
- man braucht nicht alle Perl Befehle in {} einschliessen (siehe die Log Zeilen), das war nur der Einfall einer gewitzten FHEM-Anwender, um ;; in at und Notify zu vermeiden. In ausgelagerten Modulen gibt es gar kein Grund dafuer, und selbst in at/notify finde ich es stoerend beim verstehen. Und ; nach {} ist zwar zulaessig, aber sinnlos.
- wenn man von perl Sleep auf FHEM-Sleep umsteigt: fhem "set $device $direction; sleep $diffseconds; set $device coveringStop"; dann ist das nicht blockierend, da der FHEM-sleep alles, was dahinter kommt, per InternalTimer ausfuehrt.
- downseconds/upseconds wuerde ich in 2 userattr stecken, und diese in Merten_dim mit AttrVal abfragen.

HomeAlone

Hallo Rudi,

erst einmal vielen Dank für die Tipps zum Perl Code - habe ich befolgt. :) Resultat als Attachement. Was noch fehlt, ist:

  • den Level über einen Neustart hinweg zu speichern. Hier muss ich aber noch mal verstehen, was der Unterschied zwischen Attibuten und Readings ist... (Hausaufgabe :) ).
  • Wenn ich Aktionen über den Taster selbst (also durch Drücken) durchführe, diese in den Status des Devices mit einfließen zu lassen.

ZitatAllerdings weiss ich nach Durchlesen der Diskussion nicht, was ich machen soll.
:)

Konkret zu der Frage, was Du machen "sollst": Sollst natürlich nicht, aber ich würde mich freuen, wenn Du hier Hilfestellung / Tipps geben könntest - wie jeder andere gerne auch. Für mich sind eigentlich folgende Fragen offen geblieben:


  • Was müsste man machen, damit, wenn ich ein frisches fhem aufsetze und dann einen Merten-Taster anlerne, dieser in der Oberfläche automatisch alles mitgegeben bekommt, was benötigt wird, um auch die Dim-Funktion bereitzustellen? Bietet fhem da eine Möglichkeit?
  • Würde es helfen eine config Datei für den Merten Taster zu haben? kirkan sprach das hier an. Mir ist allerdings noch nicht klar, wie eine solche Config aussehen soll / welchen Normen sie entsprechen muss. Ein kurzer Stupser in die richtige Richtung und ich kann gerne eine baseln.
  • Könnte der Grund, warum das Dimmen bei dem Merten Device nicht funktioniert, vielleicht doch mit der Tatsache zu tun haben, dass der Merten Taster mehrere Instanzen zurückmeldet? Siehe dieser Thread: http://forum.z-wave.me/viewtopic.php?f=3419&t=19279&p=46849&hilit=merten#p46849.

Viele Grüße,
Sascha

krikan

Zitat von: HomeAlone am 12 Juli 2015, 17:34:44
Würde es helfen eine config Datei für den Merten Taster zu haben? kirkan sprach das hier an. Mir ist allerdings noch nicht klar, wie eine solche Config aussehen soll / welchen Normen sie entsprechen muss. Ein kurzer Stupser in die richtige Richtung und ich kann gerne eine baseln.
Hallo Sascha,
das würde Dir nicht wirklich helfen, da Du das bereits jetzt per normalem config-Befehl mit Parameternummer/-wert machen kannst. Mit der XML-Config-Datei würdest Du "nur" einen separaten configXY-Befehl für jede Parameternummer mit Erläuterung der möglichen Parameterwerte erhalten. Zudem hat Rudi gerade implementiert, dass fehlende Classes durch die XMLs bei der Inklusion automatisch ergänzt werden können. Die Configs kommen von openzwave und müssen daher diesen https://github.com/OpenZWave/open-zwave/wiki/Adding-Devices Aufbau haben. Bitte alles einpflegen, auch wenn wir es in Fhem derzeit nicht nutzen. Wenn Du eine XML erstellst, hänge Sie hier an und ich packe sie in eine der nächsten Updates.
Gruß, Christian

HomeAlone

Hallo Krikan,

mache ich gerne. Kurze Frage, eh ich jetzt alles manuell eingebe: Unter der von Dir angegebenen URL steht, dass man product type und product id nachschlagen soll:
ZitatProduct Type and Product ID - This two numbers help identify the actual product. Again, this information can be found usually in the device manual, pepper1 database, Z-Wave Alliance Product Database and the zwcfg file.
Jetzt war ich auf der pepper1-Seite und habe unter diesem Link: http://www.pepper1.net/zwavedb/?sort=name&sort_type=desc&filter_cmd_class=&filter_frequency=&filter_language=&filter_manufacturer=69&filter_generic_class= auf der zweiten Seite eine XML-Datei für den Merten Taster gefunden. Habe ich spaßeshalber mal angehangen. Kannst Du mit dieser Definition schon etwas anfangen (existiert ein Parser dafür?) oder soll ich sie manuell in das OpenZWave Format "übersetzen"?

Gruß,
Sascha

krikan

Antworte mit dem Verweis auf heute erstellte Frage in der FAQ: die http://www.fhemwiki.de/wiki/Z-Wave#Wie_k.C3.B6nnen_fehlende_XML-Config-Informationen_f.C3.BCr_mein_ZWave-Ger.C3.A4t_in_Fhem_eingebunden_werden.3F
Bitte meckern, wenn es unverständlich ist. Natürlich freue ich mich auch über Verbesserungen.

Noch mal: Versprich Dir bloß nicht zu viel von der Config....

PS: Konntest Du eigentlich mit ZWay -so wie von Fhem gewünscht- prozentual steuern? Nach meiner Erinnerung nicht. Falls doch, war das im Log drin?

HomeAlone

So, hat was gedauert. Ich habe die Config-Dateien für den Merten Funkrolladentaster angehangen. Die 50x5xx.xml Datei habe ich innerhalb von openzwave auch wie angegeben mit make xmltest überprüft:

...
/home/pi/repos/open-zwave/config/merten/50x5xx.xml validates
...


Ich hoffe, ich habe die Anweisung auf der FAQ-Seite richtig verstanden und demzufolge nur den Merten-Teil in die angehängte manufacturer_specific.xml Datei reingetan.

Wenn nicht, bitte noch mal kurz sagen, was ich anders machen soll.

Leider habe ich nicht verstanden, wie ich einen "pull request" bei OpenZWave durchführe - habe die Daten auch alle so vorliegen wie sie für das OpenZWave Format notwendig wären, aber das werde ich dort mal erfragen. :) Das wäre vermutlich der sauberere Weg, vermute ich, da diese Infos ja auch hier einfließen.

ZitatPS: Konntest Du eigentlich mit ZWay -so wie von Fhem gewünscht- prozentual steuern? Nach meiner Erinnerung nicht. Falls doch, war das im Log drin?

Nein, konnte ich nicht.

In der Zwischenzeit habe ich an einer zweiten Rollade auch den Fibaro-Dimmer eingebaut. Das ist weit unproblematischer gewesen: Einbauen, gut quetschen :-}, anlernen und es funktioniert - auch mit Dimmen - sofort. Fast sofort: Ich musste noch in den Parametern einstellen, dass es ein Schalter und kein Taster ist, da dort noch die original Merten MEG 3715-0000 zur Steuerung verwendet werden. Ich überlege mir gerade, diese noch durch einen Taster zu ersetzen, kostet nicht viel und bedeutet zusätzlichen Komfort, da man nicht immer zwei Schalter bewegen muss, wenn man abends die Rolladen ruterfahren will / morgens hochfahren.
Als weiteren großen Vorteil sehe ich an, dass ich mit dem Fibaro-Jalousiesteuerungseinsatz über meinen Homematic 6-fach Taster das Hoch- bzw. Runterfahren unterbrechen kann (also beim Runterfahren auf die Hochtaste drücken und er hält an). Mit dem Merten-Schalter gelingt mir das über den Homematic Taster nicht - da fährt die Rollade direkt in die entgegengesetzte Richtung. Vermutlich ließe sich auch das über Programmierung in den Griff bekommen, aber ich werde die restlichen Rolladen in der Wohnung mit den Unterputz-Steuereinsätzen bestücken.

Zwar sind der Fibaro und der Mertenschalter jetzt unterschiedlicher Meinung darüber was on und off ist (also oben oder unten) aber das könnte man durch das Vertauschen von zwei Drähten ja noch in den Griff bekommen. :)

Übrigens konnte ich mit dem Fibaro Schalter nun auch meine Dim-Funktion testen: Die Rolladen fahren beide an nahezu dieselben Stellen, bei gleichen Prozentwerten. :)

krikan

Zitat von: HomeAlone am 08 August 2015, 16:30:05
Ich hoffe, ich habe die Anweisung auf der FAQ-Seite richtig verstanden und demzufolge nur den Merten-Teil in die angehängte manufacturer_specific.xml Datei reingetan.
Wenn nicht, bitte noch mal kurz sagen, was ich anders machen soll.
Auf den ersten Blick sieht das prima aus. Muss aber noch einmal in  Ruhe durchsehen.

Zitat
Leider habe ich nicht verstanden, wie ich einen "pull request" bei OpenZWave durchführe - habe die Daten auch alle so vorliegen wie sie für das OpenZWave Format notwendig wären, aber das werde ich dort mal erfragen. :) Das wäre vermutlich der sauberere Weg, vermute ich, da diese Infos ja auch hier einfließen.
Das würde es mir vereinfachen,da ich dann nur noch von ozw übernehmen müsste. Wollte das auch schon mal angehen und nehme es mir mal wieder vor.

ZitatNein, konnte ich nicht.
Wenn das mit Z-way nicht geht, die mEn angeben Merten zu unterstützen, dann werden wir es vermutlich auch nicht so einfach schaffen...

Zitat
Ich überlege mir gerade, diese noch durch einen Taster zu ersetzen, kostet nicht viel
Ich suche schon ewig einen Taster mit geringer Einbautiefe. Ist Dir da vielleicht etwas bekannt? Der Gira Wipptaster 4fach 014700 hat leider eine extreme Einbautiefe und als Einfachvariante finde ich nichts mit Mittelstellung.

ZitatÜbrigens konnte ich mit dem Fibaro Schalter nun auch meine Dim-Funktion testen: Die Rolladen fahren beide an nahezu dieselben Stellen, bei gleichen Prozentwerten. :)
Wenn Du magst, wäre es schön, wenn Du Deine endgültige Lösung posten könntest. Evtl. ist das auch etwas fürs Wiki.