Hi,
Also zunächst mal zu der Problem Konstelation.
Ich habe Milight Lampen mit einer RF Fernbedienung, die wiederum hinter Sonoff Touch T1 2 gang hängen.
Also wenn ich jetzt per Fernbedienung die Lampen Schalten will, reagieren die Lampen natürlich nicht, da in den Sonoff ja noch die Relais offen sind.
Jetzt habe ich einen Milight-Hub auf ESP basis gebaut, der das signal der fernbedienung empfangen kann und es via MQTT(2) an Fhem weiterleitet. Dort hab ich bis jetzt, durch ne ganze menge notifyer die signale gekoppelt.
Aber mit Priorität auf die Fernbedienung, die Touch sensor in den sonoff spielen im augenblick noch eine untergeordente rolle.
Sprich dafür hab ich keine Notifyer gebaut und so ergibt sich es, das die schaltzustände, wenn am sonoff geschaltet wir, sich in fhem nicht aktualisiert. (licht bleibt troz aus, auf an hängen.) das ist zwar nur ein optischer mangel, aber es stört dennoch. und unsauber ists ausserdem.
zum einen gefallen mir die vielen notifyer nicht, (mein doz sagte immer, wenn du dreimal das gleiche schreibst, packs in ne schleife)
zum andern gefällt mir nicht, das wenn ich das jetzt fertig in notifyer ausformulier, sehr wahrscheinlich einen schnellball produzier.
also:
fernbedienung schaltet off,
sonoff_off notifyer reagiert und schaltet off
darauf würde ja dann wieder der fernbedienungs notifyer reagieren und auch auf off schalten usw.
das pingpong spiel würde losgehen und der kleine raspi würde vermutlich durchdrehen.
so jetzt hader ich schon seit längerem mit dem DOIF. hab einen nach muster für meine Türklingel Alamierung in der Küche eingebaut und der tut auch genau das was er soll.
jetzt hab ich das wiki von allen seiten bezüglich dem DOIF durchgelesen und bin nun mehr als zuvor verunsichert. da ein versuch mit einer Intervallschaltung gehörig in die hose ging, da es von meim theoretischen verständniss zwar funktionieren sollte, aber es nicht tut. (das ist aber ein anderes thema und ich hoff mir mit den erkenntnissen hier aus dem thread dann selber drauf zu kommen.)
hier mal die definition aus den Sonoff - Milight notifyern
1. Licht_Wz_all:off set MQTT2_SonOff_Wz_Decke off;set MQTT2_SonOff_Wz_Wand off
2. Licht_Wz_all:on set MQTT2_SonOff_Wz_Decke on;set MQTT2_SonOff_Wz_Wand on
3. Licht_Wz_Oben:off set MQTT2_SonOff_Wz_Decke off
4. Licht_Wz_Oben:on set MQTT2_SonOff_Wz_Decke on
5. Licht_Wz_Wand:off set MQTT2_SonOff_Wz_Wand off
6. Licht_Wz_Wand:on set MQTT2_SonOff_Wz_Wand on
ich weis, hässlich, erfüllt aber im groben sein zweck.
und jetzt seit ihr gefragt. wie pack ich das ganze am besten in eine "variable schleife"/ einen "prüfablauf", um es so kurz als möglich als DOIF zu formulieren.
über rege beteidigung würde ich mich sehr freuen.
lasst mich nicht dumm sterben.
Zitat von: DasQ am 16 Dezember 2018, 11:42:44
also:
fernbedienung schaltet off,
sonoff_off notifyer reagiert und schaltet off
darauf würde ja dann wieder der fernbedienungs notifyer reagieren und auch auf off schalten usw.
das pingpong spiel würde losgehen und der kleine raspi würde vermutlich durchdrehen.
Warum soll da ein Ping-Pong entstehen?
Wenn du das RegEx geschickt wählst, dann kommt es zu keinem Ping-Pong, weil:
set GerätX on
ein Notify mit:
define nGerätY GerätY:on set Irgendwas AufStatusZ
total kalt lässt...
Und ich nheme an, dass die Fernbedienung die den Event auslöst wohl anders heißen wird als das Gerät was dann geschalten wird...
Zitat von: DasQ am 16 Dezember 2018, 11:42:44
hier mal die definition aus den Sonoff - Milight notifyern
1. Licht_Wz_all:off set MQTT2_SonOff_Wz_Decke off;set MQTT2_SonOff_Wz_Wand off
2. Licht_Wz_all:on set MQTT2_SonOff_Wz_Decke on;set MQTT2_SonOff_Wz_Wand on
3. Licht_Wz_Oben:off set MQTT2_SonOff_Wz_Decke off
4. Licht_Wz_Oben:on set MQTT2_SonOff_Wz_Decke on
5. Licht_Wz_Wand:off set MQTT2_SonOff_Wz_Wand off
6. Licht_Wz_Wand:on set MQTT2_SonOff_Wz_Wand on
ich weis, hässlich, erfüllt aber im groben sein zweck.
Erfüllt seinen Zweck?
Zumidest NICHT den mir zu sagen was das sein soll...
(gut ich könnte raten)
Wenn du etwas von deinem "Code" bzw. Versuchen etc. mitteilen willst, ist ein list immer hilfreich:
list GeräteName
in FhemWeb und die Ausgabe dann hier in code-Tags posten...
(auch ein Notifyer das eigentlich notify heißt ist in fhem ein "Gerät"/Device)
Notify (und DOIF) anlegen (lassen) geht ganz einfach mit dem EventMonitor...
Zitat von: DasQ am 16 Dezember 2018, 11:42:44
über rege beteidigung würde ich mich sehr freuen.
lasst mich nicht dumm sterben.
(Rege) Beteiligung hab ich mal gemacht...
...an dem nicht dumm sterben musst du selber arbeiten.
Gruß, Joachim
ich wollte mit 6 fast identischen list nicht zu sehr verwirren. das da oben sind schnipsel aus den notifyern.
aber um das noch nachzureichen hier ein list von zwei notifyer
Alles an
Internals:
DEF Licht_Wz_all:on set MQTT2_SonOff_Wz_Decke on;set MQTT2_SonOff_Wz_Wand on
NAME WzLichtAllSonOff_on
NOTIFYDEV Licht_Wz_all
NR 132
NTFY_ORDER 50-WzLichtAllSonOff_on
REGEXP Licht_Wz_all:on
STATE 2018-12-16 11:34:52
TRIGGERTIME 1544956492.07799
TYPE notify
READINGS:
2018-12-15 18:06:45 state active
Attributes:
group Licht
room Wohnzimmer
alles aus
Internals:
DEF Licht_Wz_all:off set MQTT2_SonOff_Wz_Decke off;set MQTT2_SonOff_Wz_Wand off
NAME WzLichtAllSonOff_off
NOTIFYDEV Licht_Wz_all
NR 133
NTFY_ORDER 50-WzLichtAllSonOff_off
REGEXP Licht_Wz_all:off
STATE 2018-12-16 11:34:55
TRIGGERTIME 1544956495.15287
TYPE notify
READINGS:
2018-12-15 18:06:45 state active
Attributes:
group Licht
room Wohnzimmer
und meine vermutung auf dem schneeball beruht auf der tatsache das eben die namen der "gegenläufigen" sonoff und milight ja doch gleich heissen.
ich versuchs aber dennoch nachert gleich mal aus, obs nur mit notifyern gehen würde. unsauber und redundant bleibts trozdem. und schon garnicht variabel.
also nicht so schön als wennes ein DIOF mit alle infragekommenden events (on und off) abfängt und dann richtig umbiegt.
problem ist aber auch, das ich noch mit einer sinnstiftendennamensgebung kämpf. da wär ich für sinnvolle tips auch sehr dankbar.
geht hier ein wenig auch ums "tue dies, lasse das" oder Den sauberen stil.
Eine Schleife bauen bzw. mittels RegEx (das solltest du mal lernen) kann man bei geschickter Namenswahl (man kann auch umbenennen: rename) auch ohne "programmierte Schleife" alle gewünschten Geräte abdecken.
Wenn das nicht geht, ist die Namenswahl evtl. nicht ausreichend gut ;)
Die lists schaue ich mir dann mal an...
Gruß, Joachim
Ein Beispiel:
set MQTT2_SonOff_Wz_Decke on;set MQTT2_SonOff_Wz_Wand on
set MQTT2_SonOff_Wz_.* on
Macht das gleiche bzw. schaltet alle Geräte die eben mit "MQTT2_SonOff_Wz_" anfangen...
Gleiches gilt auch für ein Notify und man kann auch ein "on/off" Notify mit Abfrage bauen:
define nLicht_Wz_OnOff notify Licht_Wz_all:(on|off) {if($EVENT eq "on"){fhem("set Geräte on")}elsif($EVENT eq "off"){fhem("set Geräte off")}}
KEIN! copy/paste code, sondern (teilweise) mit "pseudo-Code"...
Statt nach Perl wechseln ( '{ PERL }' ) ginge auch das fhem-IF: IF ( ) ...
Oder eben DOIF, auch da funktioniert RegEx etc.
Bei einem list von Notify (und nicht Notifyern, wie kommst du auf diesen Namen?) ist auch immer ein list des auslösenden Gerätes (also das den Event auf den das Notify reagiert/reagieren soll) ganz hilfreich...
Und wie geschrieben: eine Erzeugung von Notify DOIF etc. geht ganz einfach mit dem EventMonitor...
Gruß, Joachim
Zitat von: MadMax-FHEM am 16 Dezember 2018, 12:21:17
(das solltest du mal lernen)
reguläre ausdrücke sind für mich als fachinformatiker/webdev/usw kein fremdwort. ;) nur hat mir meine erfahrung gezeigt, das wenn man sich darauf einlässt, und irgendwann mal was ändern muss, an absolut allen stellen anpacken muss, damits dann wieder läuft. ;D
und, ich bin der meinung das man wenn man sich dieser probleme bewusst ist, besser in nem forum danach frägt und sich auf die erfahrung alter hasen verlässt. als zum fünfhunderdreiundneuzigste mal, das rad neu erfindet. :P
link zum thema würde ja reichen, oder ein vielleicht trefender suchbegriff. weil mit meinen suchbegriffen und dieser boardsuche komm ich absolut nicht weiter. da such ich besser via google in dem forum ... das ist oft viel zielführender. :)
Zitat von: MadMax-FHEM am 16 Dezember 2018, 12:29:49
(und nicht Notifyern, wie kommst du auf diesen Namen?)
denglische eigenkreation um mehren Notify einen namen zu geben.
der tip von dir dort drüber ists glaub gewesen, wonach ich gesucht hab
Ja die Forumssuche ist naja ;)
Aber die Definition von notify in fhem ist nun mal "RegEx-basiert" ;)
Wenn was brauchbares dabei war: gut! :)
Wenn nicht einfach weiter fragen...
Dann viel Spaß noch, Joachim
Zitat von: DasQ am 16 Dezember 2018, 12:11:38
...und meine vermutung auf dem schneeball beruht auf der tatsache das eben die namen der "gegenläufigen" sonoff und milight ja doch gleich heissen.
Im notify wird ein das Suchmuster ergänzt zu ^Suchmuster$, daher gibt es keine Schleife bei ähnlichen Namen.
Du könntest alles zusammenfassen in einem notify oder DOIF, wenn Du im Befehlsteil den Namen des triggernden Gerätes auswertest und dann die entsprechenden Gerätes setzt. Also für
Zitat1. Licht_Wz_all:off set MQTT2_SonOff_Wz_Decke off;set MQTT2_SonOff_Wz_Wand off
2. Licht_Wz_all:on set MQTT2_SonOff_Wz_Decke on;set MQTT2_SonOff_Wz_Wand on
3. Licht_Wz_Oben:off set MQTT2_SonOff_Wz_Decke off
4. Licht_Wz_Oben:on set MQTT2_SonOff_Wz_Decke on
5. Licht_Wz_Wand:off set MQTT2_SonOff_Wz_Wand off
6. Licht_Wz_Wand:on set MQTT2_SonOff_Wz_Wand on
das Suchmuster Licht_WZ_.* verwendest und dann $NAME abfragst und je nach Namen des aulösenden Gerätes und des EVTPART entsprechende Befehle absetzt.
Zitat von: Ellert am 16 Dezember 2018, 13:07:07
das Suchmuster Licht_WZ_.* verwendest und dann $NAME abfragst und je nach Namen des aulösenden Gerätes und des EVTPART entsprechende Befehle absetzt.
genau da scheiter ich jetzt dran. wie kann ich das einbauen?
Internals:
DEF Licht_Wz_.*:on|off {if($EVENT eq "on"){fhem("set MQTT2_SonOff_Wz_$NAME on")}elsif($EVENT eq "off"){fhem("set MQTT2_SonOff_Wz_$NAME off")}}
NAME WzLichtAllSonOff_off
NR 133
NTFY_ORDER 50-WzLichtAllSonOff_off
REGEXP Licht_Wz_.*:on|off
STATE 2018-12-16 16:57:58
TRIGGERTIME 1544975878.2384
TYPE notify
Helper:
DBLOG:
state:
DBLogging:
TIME 1544975803.09474
VALUE active
READINGS:
2018-12-16 16:57:19 state active
Attributes:
group Licht
room Wohnzimmer
klappt schonmal nicht. wie kann ich den part hinter "Licht_Wz_.*" also nur das was im ".*" ist, so hinter das MQTT2_SonOff_Wz_ pappen?
018.12.16 17:08:13 3: set MQTT2_SonOff_Wz_Licht_Wz_Wand off : Please define MQTT2_SonOff_Wz_Licht_Wz_Wand first
2018.12.16 17:08:13 3: WzLichtAllSonOff_off return value: Please define MQTT2_SonOff_Wz_Licht_Wz_Wand first
2018.12.16 17:08:13 3: MilightRemoteNotifyer return value: Please define MQTT2_SonOff_Wz first
2018.12.16 17:08:13 3: set MQTT2_SonOff_Wz_Licht_Wz_Decke off : Please define MQTT2_SonOff_Wz_Licht_Wz_Decke first
2018.12.16 17:08:13 3: WzLichtAllSonOff_off return value: Please define MQTT2_SonOff_Wz_Licht_Wz_Decke first
2018.12.16 17:08:13 3: set MQTT2_SonOff_Wz_Licht_Wz_all off : Please define MQTT2_SonOff_Wz_Licht_Wz_all first
2018.12.16 17:08:13 3: WzLichtAllSonOff_off return value: Please define MQTT2_SonOff_Wz_Licht_Wz_all first
Ich würde alles was etwas "komplizierter" als ein set-Befehl ist in eine myUtils auslagern: https://wiki.fhem.de/wiki/99_myUtils_anlegen
Dort dann als erstes eine Ausgabe der übergeben Parameter machen, also beispielsweise von $NAME und $EVENT...
Wenn ich das mal laufen lassen habe und genau sehe (Logausgaben) was kommt einfah weiter machen, evtl. "split"...
define nAllOnOff notify Licht_Wz_.*:(on|off) {my_setOnOff($NAME, $EVENT)}
sub my_setOnOff($$)
{
my ($Name, $Event) = @_;
my @NameParts = split(/_/, $Name);
Log3(undef, 3, "my_setOnOff Name: $Name Event: $Event");
}
usw.
Gruß, Joachim
Zitat von: DasQ am 16 Dezember 2018, 17:02:43
genau da scheiter ich jetzt dran. wie kann ich das einbauen?
...
klappt schonmal nicht. wie kann ich den part hinter "Licht_Wz_.*" also nur das was im ".*" ist, so hinter das MQTT2_SonOff_Wz_ pappen?
Wenn Dir reguläre Ausdrücke geläufig sind sollte sowas wie
$NAME =~ / Licht_Wz_(.*)/;
kein Problem sein, denn Du weisst ja das $1 enthält, was Du sucht ;)
In der Definition des notify sind auch Zeilenumbrüche erlaubt, das macht's übersichtlicher.
Du kannst Dir if sparen mit
set MQTT2_SonOff_Wz_$1 $EVENT"
oder als DOIF-Einzeiler:
DOIF {["^Licht_Wz_"];$device=~/^Licht_Wz_(.*)/;fhem_set("MQTT2_SonOff_Wz_$1 $event")}
Erstmal danke an euch zwei, das bringt mich schon ein ganzes stückchen weiter. Die Sorge ums dumm sterben können wir schonmal getrost abhacken.
Zitat von: Ellert am 16 Dezember 2018, 20:43:48
Wenn Dir reguläre Ausdrücke geläufig sind sollte sowas wie
$NAME =~ / Licht_Wz_(.*)/;
kein Problem sein, denn Du weisst ja das $1 enthält, was Du sucht ;)
In der Definition des notify sind auch Zeilenumbrüche erlaubt, das macht's übersichtlicher.
Du kannst Dir if sparen mit
set MQTT2_SonOff_Wz_$1 $EVENT"
Naja ich sagte ,,kein fremdwort", aber egal. Die Kleinigkeiten wie =~ sind für mich aber dennoch Neuland. Das ist ne Zuweisung? Oder ein Zeiger? Hab RegEx wiegesagt in der Vergangenheit etwas stiefmütterlich behandelt. $1 ist quasi eine allgegenwärtige Variable die man durch das wildcard .* Befüllen kann. Super thx.
Und warum ist nach $EVENT" ein Gänsefüßchen?
Sind ja bekanntlich die Kleinigkeiten im Code die eim das ganze dann um die Ohren hauen. Ich sag nur Semikolon vergessen in c => kabum ;)
ZitatNaja ich sagte ,,kein fremdwort", aber egal. Die Kleinigkeiten wie =~ sind für mich aber dennoch Neuland. Das ist ne Zuweisung? Oder ein Zeiger? Hab RegEx wiegesagt in der Vergangenheit etwas stiefmütterlich behandelt. $1 ist quasi eine allgegenwärtige Variable die man durch das wildcard .* Befüllen kann. Super thx.
Siehe https://perldoc.perl.org/perlre.html und https://perldoc.perl.org/perlop.html
Und warum ist nach $EVENT" ein Gänsefüßchen?
Unvollständig kopiert und stehen gelassen - dubistdochtoleranthinsichtlichschreibungoder ;)
so mal ein kurzes feedback.
der schnucklige einzeiler von @Damian tut mal grundsätzlich des was er soll.
{["^Licht_Wz_"];$device=~/^Licht_Wz_(.*)/;fhem_set("SonOff_Wz_$1 $event")}
Internals:
DEF {["^Licht_Wz_"];$device=~/^Licht_Wz_(.*)/;fhem_set("SonOff_Wz_$1 $event")}
MODEL Perl
NAME WzDoIfLichtMi
NR 152
NTFY_ORDER 50-WzDoIfLichtMi
STATE enabled, executed
TYPE DOIF
Helper:
DBLOG:
block_01:
DBLogging:
TIME 1545904281.39333
VALUE condition c01
mode:
DBLogging:
TIME 1545904352.32311
VALUE enabled
warning:
DBLogging:
TIME 1545902469.44469
VALUE condition c01
READINGS:
2018-12-27 10:52:43 Device Licht_Wz_Wand
2018-12-27 10:52:43 block_01 executed
2018-12-27 10:52:32 mode enabled
Regex:
cond:
:
0:
"^Licht_Wz_" ^Licht_Wz_
condition:
0 ::EventDoIf('^Licht_Wz_',$hash,'',0);$device=~/^Licht_Wz_(.*)/;fhem_set("SonOff_Wz_$1 $event")
devices:
helper:
event hue: 359,status: off,brightness: 230,level: 90,saturation: 0,off,bulb_mode: color
globalinit 1
last_timer 0
sleeptimer -1
triggerDev Licht_Wz_Wand
triggerEvents:
hue: 359
status: off
brightness: 230
level: 90
saturation: 0
off
bulb_mode: color
triggerEventsState:
hue: 359
status: off
brightness: 230
level: 90
saturation: 0
state: OFF
bulb_mode: color
internals:
itimer:
perlblock:
0
readings:
trigger:
uiState:
uiTable:
Attributes:
group Licht
room Wohnzimmer
sortby 6
stateFormat mode, block_01
ABER, so wie im threadtopic steht, wollte ich eben genau besagten schneeball nicht, den ich mir dann zusammen gebaut hab.
sind ja wie oben schon geschrieben 2 schalter für ein und die selbe sache. einer per MiLight Fernbedienung und einer direkt am SonOff.
also habe ich den einzeler für sonoff umgemodelt und das sah dann so aus
{["^SonOff_Wz_"];$device=~/^SonOff_Wz_(.*)/;fhem_set("Licht_Wz_$1 $event")}
jeder einzeler für sich funktioniert (mit kleinen wenn und aber ... eigentlich bräuchts nur die events "on" und/oder "off").
aber sobald ich beide aktiviere, geht der punk ab. sprich die beiden doif triggern sich gegenseitig, bis klein raspi kapituliert.
dacht ich mir, ok dann muss das erstens alles in eine doif abfrage mit if verschachtelt. (soweit war ich denkmässig noch nie, aber ich bin auch hier der meinung es kommt zu besagtem schneeball)
und da ichs nicht syntaxfehlerfrei formuliert bekomm, versuch ichs mal hier zu beschreiben.
{(["^SonOff_Wz_"] eq "on" or ["^SonOff_Wz_"] eq "off" ;$device=~/^SonOff_Wz_(.*)/;)or
(["^Licht_Wz_"] eq "on" or ["^Licht_Wz_"] eq "off";$device=~/^Licht_Wz_(.*)/;)
fhem_set("SonOff_Wz_$1 $event") DOELSEIF
fhem_set("Licht_Wz_$1 $event")
}
so sollte das ungefähr aussehen. aber mir fliegts natürlich um die ohren. entweder massig fehler, oder eben ein pingpong spiel geht los.
der frust ist gross. :D :-\
Das DOIF ist für den Perl-Modus geschrieben, dort gibt es kein DOELSEIF, Du müsstest mit if, else, elsif arbeiten.