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
Du kannst versuchen Dir ein kleines Modul selbst zu schreiben. Die URLs kannst Du dann intern aufrufen.
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...
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
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.
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
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.
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;
}
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
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
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
@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 (https://forum.fhem.de/index.php?topic=61482.0)
Viele Grüße
Gisbert
Sehr interessant. Kannst du mir noch die anderen möglichen Pin Namen nennen
pin=FunctionRunter
Grüße
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?
Ich denke mal das es keine andere Möglichkeit zum steuern gibt und er einfach damit die Teile ansteuern will
Bin mir nicht sicher ob du es verwenden kannst, aber kennst du dieses hier:
https://forum.fhem.de/index.php/topic,58904.0.html (https://forum.fhem.de/index.php/topic,58904.0.html)
Hallo Ralf,
die IP-Adresse und die Schaltbefehle sind völlig egal an dieser Stelle. Fhem und notify sollen einen Befehl absetzen, ob der sinnvoll ist, irgendwo ankommt, ist bis zu diesem Punkt erstmal egal.
Wenn ich zu einem Device 3 notifys anlege, dann funktioniert die Schaltung; aber dann hab ich jetzt schon 15 notifys mit Aussicht auf mehr.
Wenn Dir noch etwas einfällt, dann bin ich interssiert.
Hallo CoolTux,
bei dem Programm auf dem Sonoff Dual handelt es sich um einen Sketch von dieser Quelle:
https://blog.thesen.eu/funk-wlan-markisensteuerung-mit-esp8266-und-arduino/ (https://blog.thesen.eu/funk-wlan-markisensteuerung-mit-esp8266-und-arduino/), den ich für meine Bedürfnisse angepasst habe. Im Detail gibt es deutliche Unterschiede zum Orginal.
FunctionHoch, ...Runter, ...Stop sind im Sketch definierte Befehle. Bei Bedarf kann ich das Programm zur Verfügung stellen; aber bitte nicht meckern, wahrscheinlich ist noch Code enthalten, der nicht benötigt wird.
Man kann den Sonoff resp. ESP8266 ganz ohne Fhem über einen Webbrowser steuern. Das ist schon ganz nett, hat aber mit Automation nichts zu tun.
Viele Grüße
Gisbert
Also bevor das hier ausartet. Ohne Perl kommst du nicht weiter. Ich empfehle dir Dummys mit setList hoch runter stop an zu legen und einem Reading mit der IP des Webservers für den Dummy Rolladen. Dann ein Notify welches eine Sub aufruft und an diese den Schaltbefehl und die IP übergibt
Zitat von: Gisbert am 02 Januar 2017, 21:21:21
Hallo Ralf,
die IP-Adresse und die Schaltbefehle sind völlig egal an dieser Stelle. Fhem und notify sollen einen Befehl absetzen, ob der sinnvoll ist, irgendwo ankommt, ist bis zu diesem Punkt erstmal egal.
Wenn ich zu einem Device 3 notifys anlege, dann funktioniert die Schaltung; aber dann hab ich jetzt schon 15 notifys mit Aussicht auf mehr.
Wenn Dir noch etwas einfällt, dann bin ich interssiert.
Hallo Gilbert,
die Dummies hast Du ja schon ....
das Notify auch
wenn Du jetzt im Notify Verbose auf 5 stellst, sollte es auch loslaufen und einige Dinge tun
bei Bedarf kannst Du noch in die vor die Variable Declaration eine Zeile mit
Log3 'nty.Rollade', 5, "Device:$DEVICE Event:$EVENT";
einfügen, dann siehst Du alle Aufrufparameter bei Verbose auf 5 und dann wirst Du entsprechend weiter sehen...
das Notify reagiert aber nur auf die 3 Begriffe in den Klammern vo der Definition
Wenn es nur darum geht die Übersicht zu behalten, dann hier:
define Wohnzimmer.Westseite DOIF\
(["$SELF:runter"]) ({(system "wget -qO /dev/null http://192.168.178.48/?pin=FunctionRunter")})\
DOELSEIF\
(["$SELF:rauf"]) ({(system "wget -qO /dev/null http://192.168.178.48/?pin=FunctionRauf")})\
DOELSEIF\
(["$SELF:stop"]) ({(system "wget -qO /dev/null http://192.168.178.48/?pin=FunctionStop")})
attr Wohnzimmer.Westseite do always
attr Wohnzimmer.Westseite readingList Jalousie
attr Wohnzimmer.Westseite room test
attr Wohnzimmer.Westseite setList Jalousie:rauf,runter,stop
attr Wohnzimmer.Westseite webCmd Jalousie
Ein DOIF, inkl. der "Bedienelemente" und aller drei Befehle. Die Befehle habe ich mal so aus deinem ersten Post abgeleitet. Bei mir bleibt FHEM hängen, denke wegen dem wget Befehl, andere System Befehle laufen durch...
Du kannst das auch per
set Wohnzimmer.Westseite Jalousie rauf/runter/stop
ansprechen...
Ich gehe mal davon aus das wir hier nicht nur von einer IP reden sondern von einer per Rolladen oder im besten Fall einer pro Rolladenpaar
Richtig, es handelt sich um eine IP pro Rollladen.
@automatisierer,
ein DOIF pro Rollladen/Device ist immerhin schon mal ein Fortschritt. Ich werde es ausprobieren, wenn ich wieder Zeit hab.
Ich werde Dir bis Wochenende was fertig machen und testen. Wenn du mir versprichst den Code zu verstehen den ich dir gebe damit du ihn selber warten kannst.
Dummys anlegen
defmod dummyRolladenWohnzimmer1 dummy
attr dummyRolladenWohnzimmer1 readingList ipAdresse
attr dummyRolladenWohnzimmer1 room Test
attr dummyRolladenWohnzimmer1 setList ipAdresse up:noArg down:noArg stop:noArg
defmod dummyRolladenWohnzimmer2 dummy
attr dummyRolladenWohnzimmer2 readingList ipAdresse
attr dummyRolladenWohnzimmer2 room Test
attr dummyRolladenWohnzimmer2 setList ipAdresse up:noArg down:noArg stop:noArg
...
Und so weiter. Versuche sprechende Namen zu finden. Wichtig ist "dummyRolladen" muß am Anfang bleiben.
Nach dem Du die Dummys angelegt hast, musst Du
set dummyRolladenWohnzimmer1 ipAdresse IP
ausführen. Und das ganze pro Rolladen.
Und nun das Notify
defmod notifyRolladenControl notify dummyRolladen.*(up|down|stop) { rolladenControl($NAME,ReadingsVal("$NAME","ipAdresse",0),$EVTPART0) }
attr notifyRolladenControl room Test
Und nun noch folgendes. Kopiere die Datei /opt/fhem/FHEM/myUtilsTemplate.pm nach /opt/fhem/FHEM/99_myUtils_RolladenControl.pm
Danach in FHEM Web unter edit Files auf das File 99_myUtils_RolladenControl.pm gehen und alles im File löschen und folgendes dafür eintragen
##############################################
# $Id: myUtilsTemplate.pm 7570 2015-01-14 18:31:44Z rudolfkoenig $
#
# Save this file as 99_myUtils.pm, and create your own functions in the new
# file. They are then available in every Perl expression.
package main;
use strict;
use warnings;
use POSIX;
sub
myUtils_RolladenControl_Initialize($$)
{
my ($hash) = @_;
}
# Enter you functions below _this_ line.
my %cmdSketchPin = (
'down' => 'FunctionRunter',
'up' => 'FunctionRauf',
'stop' => 'FunctionStop'
);
sub rolladenControl($$$) {
my ($name,$ipRolladen,$cmd) = @_;
my $url = "http://" . $ipRolladen;
$url .= "/?pin=" . $cmdSketchPin{$cmd};
my($err,$data) = HttpUtils_BlockingGet({
url => $url,
timeout => 3,
method => "GET",
header => "Content-Type: application/xml",
});
if( !$data ) {
Log3 $name, 3, "($name) - empty answer received for $url";
return undef;
} elsif( $data =~ m'HTTP/1.1 200 OK' ) {
Log3 $name, 4, "($name) - empty answer received for $url";
return undef;
}
return;
}
1;
Danach ein reload 99_myUtils_RolladenControl
Das sollte eigentlich alles sein. Bitte dann mal testen.
Bei Fragen oder Problemen einfach melden.
Grüße
Zitat von: CoolTux am 03 Januar 2017, 09:28:54
Ich werde Dir bis Wochenende was fertig machen und testen.
ich hab keine Ahnung woran es liegt, aber ich hatte schon den ganzen Tag so nen Wochenendgefühl... 8)
Wochenend und Sonnenschein ;D 8)
Hallo CoolTux,
super, aber im Moment scheint die Sonne noch nicht für mich; ich werde erst frühestens am WE wieder Zeit haben.
Ich versuche mich kundig zu machen, dass ich deine Programmierung nachvollziehen kann. Ich habe auch gelegentlich Hilfe hier zuhause, in Form meines Sohnes, wenn ich ihn denn motivieren kann.
Viele Grüße
Gisbert
Wie gesagt. Wenn Fragen dann fragen
Hallo CoolTux,
super Arbeit, ganz großes Theater, es funktioniert auf Anhieb, vielen lieben Dank !!!
Mit dem Verstehen deiner Programmierung tue ich mich allerdings schwer. :-[
Im Groben kann ich es nachvollziehen, aber von Verstehen bin ich leider weit weg.
Ich verspreche aber, dass ich ich mir Mühe geben werde.
Ich hab noch die folgenden Attribute gesetzt:
attr dummyRolladenWohnzimmerWestseite webCmd Hochfahren:Anhalten:Runterfahren
attr dummyRolladenWohnzimmerWestseite eventMap up:Hochfahren stop:Anhalten down:Runterfahren
Damit kann ich in Fhem durch Anklicken im Webbroser (oder entsprechend auf dem Smartphone) den Rolladen neben einer Automatisierung auch einfach händisch bedienen.
Nochmals vielen Dank
Gisbert
Hallo Gisbert,
Das freut mich das es bei Dir gleich geklappt hat. Der Rest kommt mit der Zeit wenn man sich mehr ins Thema einarbeitet. Und je mehr Du mit FHEM machen willst um so mehr musst Du Dich einarbeiten. Dafür sind dem ganzen fast keine Grenzen gesetzt.
Ich habe zum Beispiel mir letzten Sommer 2 Klimaanlagen von Obi mit WLan besorgt. Die will ich im Winter in FHEM integrieren. Möglich ist das, aber ich muß da noch ne Menge programmieren.
Aber es ist Machbar und das ist das tolle an FHEM.
Dann mal viel Spaß mit Deinen Rolläden.
Grüße
Leon