[gelöst] Wie kann man eigenen Devices Befehle zuordnen?

Begonnen von Gisbert, 01 Januar 2017, 22:42:54

Vorheriges Thema - Nächstes Thema

Gisbert

Hallo,

ich habe eigene Geräte zum Bedienen von Rollläden auf Basis von Sonoff Dual und einer eigenen kleinen Software auf den Sonoff's gebastelt.
Über einen Webbrowser kann man die Rolläden bedienen, die Anbindung erfolgt über Wlan.
Die Einbindung in Fhem ist über ein Dummy-Device möglich, so dass Hochfahren (on), Runterfahren (off) und Anhalten (stop) gesteuert werden können.
Hinter jedem Befehl steht ein notify, z.B.:
define Wohnzimmer.Westseite.Runter notify Wohnzimmer.Westseite:Runterfahren "wget -qO /dev/null http://192.168.178.48/?pin=FunctionRunter"
Das funktioniert soweit, aber für einen Rollladen sind dann 3 notify's notwendig, bei vielen Rollläden kommt man dann auf eine ordentliche Anzahl.
Die Übersichlichkeit bzw. die Länge der Fhem-Startseite (Everything) wird entsprechend schlechter bzw. länger.

Gibt es eine andere Möglichkeit statt notify, wie man den Befehlen eine Aktion zuordnen kann?

Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

CoolTux

Du kannst versuchen Dir ein kleines Modul selbst zu schreiben. Die URLs kannst Du dann intern aufrufen.
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

automatisierer

DOIF würde sich da auch anbieten, da kannst du direkt dropDown Menu's mit einbauen. Benötigst dann also nur noch ein DOIF pro Rollladen...

Wuppi68

Du kannst auch pro Rollade einen Dummy machen ..

rollade_1, rollade_2, rollade_3 ... rollade_n

in jedem Device ein Webcmd "rauf, runter, stop"

jetzt noch ein

define nty.rollade notify rollade_.:(rauf|runter|stop)

in dem notify hast Du dann $DEVICE die Rollade und $EVENT das rauf runter stop gibt dazu sehr gutes in der Commandref
FHEM unter Proxmox als VM

CoolTux

Zitat von: Wuppi68 am 01 Januar 2017, 23:09:35
Du kannst auch pro Rollade einen Dummy machen ..

rollade_1, rollade_2, rollade_3 ... rollade_n

in jedem Device ein Webcmd "rauf, runter, stop"

jetzt noch ein

define nty.rollade notify rollade_.:(rauf|runter|stop)

in dem notify hast Du dann $DEVICE die Rollade und $EVENT das rauf runter stop gibt dazu sehr gutes in der Commandref

Ich denke es geht wohl eher darum die Rolladen Dummys entsprechenden IPS zu zu ordnen. Oder verstehe ich das falsch.
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

Gisbert

Hallo,

vielen Dank für eure Anregungen.

Am besten wäre außer den dummy-devices keinerlei notifys oder DOIFs zu haben. Hierzu wäre entweder ein kleines eigenes Modul oder evtl. eine Funktion in myUtils nötig; dafür fehlen mir allerdings die Programmierfähigkeiten.

Für hilfreich halte ich den Vorschlag von Ralf, die Anzahl der notifys auf eins pro device zu reduzieren.
Ich versuche das umzusetzen, wobei ich noch nicht genau weiß, wie und ob ich das hinbekomme; möglicherweise muss ich nochmals fragen.

Am liebsten wäre mir, wenn außer den dummy-devices keine weiteren eigenständigen Befehle nötig wären, d.h. eine Zuordnung der sinngemäßen Befehle on/off/stop zu der jeweiligen Ausführung.

Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

CoolTux

Hilft Dir das hier weiter

https://forum.fhem.de/index.php/topic,55036.45.html

Anscheinend gibt es bereits Möglichkeiten für sonoff zu schalten. Beherrscht wohl MQTT.
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

Wuppi68

#7
nicht ein Notify für jedes Device

Ein Notify für alle Devices :-)

Es wird im Noty entschieden welches Device final angesteuert wird

ungefähr so ungetestet als Proof of Conzept aus meinen Kopf

define Rollade_1 dummy
define Rollade_2 dummy
define Rollade_3 dummy
attr Rollade_3 setList Rauf,Runter,Stop
...
define Rollade_9 dummy
define Rollade_A dummy                      # wegen dem Regex für das Notify (. ist nur ein Zeichen)
deffne Rollade_B dummy
...

define nty.Rollade notify  nty.Rollade_.:(rauf|runter|stop) {
  my $DEVICE ~= /Rollade_//;     # entferne den Prefix Rollade_
  my $Path2Rollade = '';

  if ( $DEVICE eq '1'  ) { $Path2Rollade = 'http:irgendwo.im.netz.lokal/DuWeisstSchonWo/Rollade1' }
  elsif  ( $DEVICE eq '2'  ) { $Path2Rollade = 'http:irgendwo.im.netz.lokal/DuWeisstSchonWo/Rollade2' }
  elsif  ( $DEVICE eq '3'  ) { $Path2Rollade = 'http:irgendwo.im.netz.lokal/DuWeisstSchonWo/Rollade3' }
  ...
  else { Log3 'nty.Rollade', 3, "Unbekanntes Device: $DEVICE" };

  if ($EVENT eq 'rauf') { $Path2Rollade += '/Rauf' }
  elsif ($EVENT eq 'runter') { $Path2Rollade += '/Runter'}
  elsif ($EVENT eq 'stop') { $Path2Rollade += '/Stop'}
  else { Log3 'nty.Rollade', 3, "unbekannter Befehl: $EVENT" }

  wget $Path2Rollade;
}

FHEM unter Proxmox als VM

Gisbert

Hallo Ralf,

vielen Dank für die Idee.
Ein Notity, das alle Rollladen behandelt, ist mehr als ich erhofft habe.

Ich versuche gerade dein Beispiel zu implementieren, was mir aber nicht gelingt.
Die setList müsste die nicht durch Leerzeichen getrennt sein?
Es müsste auch klein geschrieben sein: attr Rollade_1 setList rauf runter stop

Ist die Definition des notifys so richtig:
define nty.Rollade notify  nty.Rollade_.:(rauf|runter|stop)
Insbesondere das nty.Rollade_. ?

Müsste es nicht Rollade_. heißen?
In diesem Fall steht zumindest ein exec im Logfile:
2017.01.02 16:17:51 4: dummy set Rollade_1 runter
2017.01.02 16:17:51 4: nty.Rollade exec {

allerdings gefolgt von dem Inhalt der geschweiften Klammer; d.h. es wird nicht der beabsichtige Befehl abgesetzt, sondern der gesamte Inhalt inclusive der geschweiften Klammern, was natürlich zu einem endlosen Gemecker im Logfile führt.

Bei den Befehlen:
  my $DEVICE ~= /Rollade_//;
  my $Path2Rollade = '';
scheint auch was nicht zu stimmen.

Ich hab's mehrfach mit leichten Abwandlungen versucht (in der Hoffnung, dass ein dummes Huhn auch mal ein Korn findet), hat aber bisher nicht funktioniert.
Kannst Du noch mal drüber schaun, wäre eine interessante Vereinfachung, wenn nur ein notify für alle Rollläden gehen würde.

Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Wuppi68

Hallo Gisbert,

bei der setlist habe ich nur auf die Superschnelle in die Commandref geschaut ....

kann auch mit Leerzeichen sein :-)

das Notify ins schon richtig von der Definition

beim my $DEVICE muss das my weg

ansonsten setzte mal vom Notify den Verbose auf 5 und poste danach den Log Output .... dann sehen wir schon mehr :-)

Und auch bitte Deine Aktuelle Version vom Notify (der DEF Part sollte reichen)

und nach Möglichkeit nicht in der CFG von Hand ändern - geht besser im Web Frontend unter DEF
FHEM unter Proxmox als VM

Gisbert

#10
Hallo Ralf,

super, dass Du dich der Sache annimmst.

Der Eintrag im Logfile:
2017.01.02 19:09:00 4: WEB_::ffff:192.168.178.37_49576 GET /fhem?cmd={ReadingsVal(%22Rollade_1%22,%22rauf%22,%22%22)}&XHR=1; BUFLEN:0
2017.01.02 19:09:00 5: Cmd: >{ReadingsVal("Rollade_1","rauf","")}<
2017.01.02 19:09:00 4: name: /fhem?cmd={ReadingsVal(%22Rollade_1%22,%22rauf%22,%22%22)}&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2017.01.02 19:09:01 4: Connection closed for WEB_::ffff:192.168.178.37_49529: Connection reset by peer
2017.01.02 19:09:01 4: WEB_::ffff:192.168.178.37_49576 POST /fhem&detail=Rollade_1&dev.setRollade_1=Rollade_1&cmd.setRollade_1=set&arg.setRollade_1=rauf&val.setRollade_1=; BUFLEN:0
2017.01.02 19:09:01 5: Cmd: >set Rollade_1 rauf<
2017.01.02 19:09:01 4: dummy set Rollade_1 rauf
2017.01.02 19:09:01 5: Triggering Rollade_1 (1 changes)
2017.01.02 19:09:01 5: Starting notify loop for Rollade_1, 1 event(s), first is rauf
2017.01.02 19:09:01 4: WEB_::ffff:192.168.178.37_49576 GET /fhem?detail=Rollade_1&fw_id=; BUFLEN:0
2017.01.02 19:09:01 4: name: /fhem?detail=Rollade_1&fw_id= / RL:2334 / text/html; charset=UTF-8 / Content-Encoding: gzip
/
2017.01.02 19:09:01 4: WEB_::ffff:192.168.178.37_49576 GET /fhem?cmd={ReadingsVal(%22Rollade_1%22,%22quatsch%22,%22%22)}&XHR=1; BUFLEN:0
2017.01.02 19:09:01 5: Cmd: >{ReadingsVal("Rollade_1","quatsch","")}<
2017.01.02 19:09:01 4: name: /fhem?cmd={ReadingsVal(%22Rollade_1%22,%22quatsch%22,%22%22)}&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2017.01.02 19:09:01 4: WEB_::ffff:192.168.178.37_49575 GET /fhem?cmd={AttrVal(%22Rollade_1%22,%22room%22,%22%22)}&XHR=1; BUFLEN:0
2017.01.02 19:09:01 5: Cmd: >{AttrVal("Rollade_1","room","")}<
2017.01.02 19:09:01 4: name: /fhem?cmd={AttrVal(%22Rollade_1%22,%22room%22,%22%22)}&XHR=1 / RL:21 / text/plain; charset=UTF-8 / Content-Encoding: gzip
/
2017.01.02 19:09:01 4: WEB_::ffff:192.168.178.37_49576 GET /fhem?XHR=1&inform=type=status;filter=Rollade_1;since=1483380540;fmt=JSON&fw_id=878×tamp=1483380541532; BUFLEN:0


Das notify:
define nty.Rollade notify nty.Rollade_.:(rauf|runter|stop) {
  $DEVICE ~= /Rollade_//;
  my $Path2Rollade = '';

  if ( $DEVICE eq '1'  ) { $Path2Rollade = 'http:irgendwo.im.netz.lokal/DuWeisstSchonWo/Rollade1' }
  elsif  ( $DEVICE eq '2'  ) { $Path2Rollade = 'http:irgendwo.im.netz.lokal/DuWeisstSchonWo/Rollade2' }
  elsif  ( $DEVICE eq '3'  ) { $Path2Rollade = 'http:irgendwo.im.netz.lokal/DuWeisstSchonWo/Rollade3' }
  else { Log3 'nty.Rollade', 3, "Unbekanntes Device: $DEVICE" };

  if ($EVENT eq 'rauf') { $Path2Rollade += '/Rauf' }
  elsif ($EVENT eq 'runter') { $Path2Rollade += '/Runter'}
  elsif ($EVENT eq 'stop') { $Path2Rollade += '/Stop'}
  else { Log3 'nty.Rollade', 3, "Unbekannter Befehl: $EVENT" }

  wget $Path2Rollade;
}


Das dummy device:
define Rollade_1 dummy
attr Rollade_1 setList rauf runter stop quatsch


Deine Aktuelle Version vom notify (der DEF Part sollte reichen):
$Id: 91_notify.pm 11984 2016-08-19 12:47:50Z rudolfkoenig
sub
notify_Define($$)
{
  my ($hash, $def) = @_;
  my ($name, $type, $re, $command) = split("[ \t]+", $def, 4);

  if(!$command) {
    if($hash->{OLDDEF}) { # Called from modify, where command is optional
      (undef, $command) = split("[ \t]+", $hash->{OLDDEF}, 2);
      $hash->{DEF} = "$re $command";
    } else {
      return "Usage: define <name> notify <regexp> <command>";
    }
  }

  # Checking for misleading regexps
  return "Bad regexp: starting with *" if($re =~ m/^\*/);
  eval { "Hallo" =~ m/^$re$/ };
  return "Bad regexp: $@" if($@);
  $hash->{REGEXP} = $re;
  my %specials= (
    "%NAME" => $name,
    "%TYPE" => $name,
    "%EVENT" => "1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0",
    "%SELF" => $name,
  );
  my $err = perlSyntaxCheck($command, %specials);
  return $err if($err);
  $hash->{".COMMAND"} = $command;

  my $doTrigger = ($name !~ m/^$re$/);            # Forum #34516
  readingsSingleUpdate($hash, "state", "active", $doTrigger);
  notifyRegexpChanged($hash, $re);

  return undef;
}


So wie ich es einschätze, kommt es gar nicht zur Ausführung eines Befehls.
Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

Gisbert

@CoolTux,

es handelt sich um einen ESP8266 in den Sonoff-Bauteilen.
Prinzipiell könnte man die auch mit ESPEasy flashen.
Für einen Betrieb eines Rollladen mit 2 Relais ist das aber nichts.
Ich hab das mal offline ausprobiert; es kommt zu Verzögerungen bis zu gleichzeitigem Schalten der beiden Relais - das dürfte ein Rollladenmotor nicht lange gutheißen.

Ich hab deshalb eine Software genutzt, die ich dann noch für meine Bedürfnisse angepasst hab.
Siehe dazu auch: https://forum.fhem.de/index.php?topic=61482.0

Viele Grüße
Gisbert
Aktuelles FHEM | PROXMOX | Fujitsu Futro S740 | Debian 12 | UniFi | Homematic, VCCU, HMUART | ESP8266 | ATtiny85 | Wasser-, Stromzähler | tuya local | Wlan-Kamera | SIGNALduino, Flamingo Rauchmelder FA21/22RF | RHASSPY | DEYE | JK-BMS | ESPHome

CoolTux

Sehr interessant. Kannst du mir noch die anderen möglichen Pin Namen nennen
pin=FunctionRunter


Grüße
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

Wuppi68

hmmmmm,

irgendwie ist mir gerade nicht wirklich klar, was Du von wo aus steuern willst ...


den Code für das Notify musst Du natürlich an Deine Gegebenheiten entsprechend anpassen ... ist halt nur ein Suprt Grob Konzept als Vorlage für Dein eigenes Werk :-)


Kannst Du die Rolladen schon aus FHEM bedienen und suchst "nur" nach einer einfacheren Möglichkeit?



FHEM unter Proxmox als VM

CoolTux

Ich denke mal das es keine andere Möglichkeit zum steuern gibt und er einfach damit die Teile ansteuern will
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