Hi,
ich habe gerade einen Hänger, schon mit notify und doif probiert, irgendwie will es nicht...
Ich kopiere meinen Code erst gar nicht hier rein, is eh blödsinn ;)
Ich beschreibe es mal so :
Wenn tastenfeld = 1 dann set Licht1 toggle
wenn Tastenfeld = 2 dann set Licht2 toggle
wenn Tastenfeld = 4 dann irgendwas
wenn Tastenfeld = 8 dann .... usw
usw...
Komme mir gerade blöd vor 8)
Irgendwie komme ich mir gerade blöd vor. ??? Welches Tastenfeld meinst du denn eigentlich. Wie ist das eingebunden?
Achso, ja, ein TTP229, das hat 16 Tasten und liefert einen ScanCode Zurück, entweder 1-16 oder Binär 1-32768 (so habe ich es eingestellt, damit unauswertbare krumme Werte rauskommen, wenn ich mit meinen Wurschtfingern 2 Touchfelder gleichzeitig treffe). Ist per ESPEasy eingebunden.
Also wenn tastenfeld:scancode = 4 dann mach irgendwas
Also wenn tastenfeld:scancode = 8 dann mach irgendwas anderes sozusagen ;)
und wenn null, mach nix.
wie wäre es denn wenn du uns trotzdem etwas code zeigst.
so ist es schwer dir zu helfen, wir können ja nicht wissen, ob dein regexp im notify falsch ist. dein trigger im doif. oder ob du die if-abfrage falsch gebaut hast, und eine zuweisung '=' und keinen vergleich '==' im code stehen hast.... usw usw.
also bitte etwas mehr details :)
Habe etwas ähnliches mit lircd.
Habe lircd nicht direkt in FHEM (Zeit-Probleme), sondern extern und es pustet mir die Tastendrücke in einen Dummy.
Dann ein Notify:
define LIRC_play notify LIRC:play set Lautsprecher on
Also wenn die "play" Taste an der Fernbedienung gedrückt wird, macht er den set-Befehl. Nun für jede Taste ein Notify ... und das war es. Probleme damit?
Das ist wohl eine gute idee... Aber wie hat dann so ein Dummy auszusehen und wie bekomme ich die scancode Aktion ins dummy?
Dummy: Siehe Doku
Tastenfeld: Da kann ich Dir nicht helfen .. wie wird es denn aktuell "eingespielt"?
wahrscheinlich mit weniger Konfigurationen ... ein einzelnes Notify und alles Weitere in eine Form in 99_myUtils auslagern. Übergabeparameter ist dann $EVENT oder $EVTPART1 in dem der Wert 1-16 enhalten ist ... je nachdem wie das Event aussieht.
In der Form baust du dann ein switch-case für die 16 Fälle + ggf. Fehler. ... https://perldoc.perl.org/5.8.9/Switch.html
Schau dir mal das hier an, Teile kannst wahrscheinlich übernehmen und anpassen ... https://forum.fhem.de/index.php/topic,20581.msg141181.html#msg141181
Ob Du jetzt in der 99_myUtils ein if machst, oder dieses durch die regex bei der notify-Erstellung .. da ziehe ich (persönlich) die notifys vor.
Aber jeder wie er will ;o)
Zitat von: Wernieman am 16 Februar 2018, 14:17:03
Dummy: Siehe Doku
Tastenfeld: Da kann ich Dir nicht helfen .. wie wird es denn aktuell "eingespielt"?
Wie man ein Dummy anlegt weiß ich, aber nir ist nicht ganzt klar, wie das entsprechend auf meine readings vom Tastenfeld reagiert / reagieren soll. Und brauche ich das Dummy, wenn ich sowieso direkt auf "ScanCode" reagieren könnte...
Tastenfeld: Habe ein Reading mit der entsprechenden Nummer: tastenfeld:scancode oder um es Präzise zu machen: ESPEasy_SWz1_Touch mit dem Reading ScanCode
Zitat von: Wernieman am 16 Februar 2018, 15:54:14
Ob Du jetzt in der 99_myUtils ein if machst, oder dieses durch die regex bei der notify-Erstellung .. da ziehe ich (persönlich) die notifys vor.
Aber jeder wie er will ;o)
Jup, wollte möglichst ein "sauberes" FHEM haben, was ausschließlich über die FHEM.cfg zu sichern ist. Hab schon einen MQTT Broker, den muss ich auch schnell wieder loswerden ;) Womöglich bekäme ich den Umbau des Pear Codes sogar hin, auch wenn ich da keine Vorkenntnisse habe. Abe rich würde es gerne erst mal vermeiden 8)
Dz hast also ein Device mit einem Reading, auf das Du reagieren willst?
Gib uns mal mitte ein "list" des Device
Internals:
CFGFN
DEF 192.168.5.222 80 espBridge SWZ1_Touch
ESP_BUILD 20100
ESP_BUILD_GIT mega-20180206
ESP_BUILD_NOTES - Mega
ESP_NODE_TYPE_ID 17: ESP Easy Mega
ESP_SLEEP 0
ESP_UNIT 2
ESP_VERSION 2
HOST 192.168.5.222
IDENT SWZ1_Touch
INTERVAL 300
IODev espBridge
LASTInputDev espBridge
MSGCNT 135
NAME ESPEasy_SWZ1_Touch
NOTIFYDEV global
NR 10043
NTFY_ORDER 50-ESPEasy_SWZ1_Touch
PORT 80
STATE absent
SUBTYPE device
TYPE ESPEasy
VERSION 1.35
espBridge_MSGCNT 135
espBridge_TIME 2018-02-15 21:34:27
READINGS:
2018-02-15 21:34:27 ScanCode off
2018-02-17 10:03:06 presence absent
2018-02-17 10:03:06 state absent
helper:
fpc 1518723246
pm:
Encode 1
JSON 1
received:
Attributes:
IODev espBridge
Interval 300
group ESPEasy Device
presenceCheck 1
readingSwitchText 1
room ESPEasy
setState 3
Wobei der ScanCode 0=off, 1=on ist, dann geht es erst mit Zahlen weiter...
Zitat von: nils_ am 16 Februar 2018, 08:50:23
wie wäre es denn wenn du uns trotzdem etwas code zeigst.
so ist es schwer dir zu helfen, wir können ja nicht wissen, ob dein regexp im notify falsch ist. dein trigger im doif. oder ob du die if-abfrage falsch gebaut hast, und eine zuweisung '=' und keinen vergleich '==' im code stehen hast.... usw usw.
also bitte etwas mehr details :)
Ups hatte Deinen Beitrag übersehen... Haber alles gelöscht weil es eh murks war ;-)
Ups .. sorry, aber bei felchem Feld kommt jetzt Deine Tasteninformationen?
Sehe momentan den Wald vor lauter Bäumen nicht ...
readings: ScanCode. Der lautet off, on, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16636 oder 32768 ;)
also z.B. ein notify auf:
SWZ1_Touch.ScanCode:2
Ungetestet ..
Jup, das hatte ich probiert, aber wie hat das genau auszusehen? Korrekte Syntax?
ESPEasy_SWZ1_Touch:ScanCode.* set SonoffWZ2 toggle
funktioniert (also so lange ich quasi gedrückt halte, isses licht aus)...
Nur die Auswertung geht nicht:
ESPEasy_SWZ1_Touch:ScanCode.* = 2 set SonoffWZ2 toggle
oder
ESPEasy_SWZ1_Touch:ScanCode.*:2 set SonoffWZ2 toggle
oder
ESPEasy_SWZ1_Touch:ScanCode:2 set SonoffWZ2 toggle
oder
ESPEasy_SWZ1_Touch.ScanCode:2 set SonoffWZ2 toggle
is alles Murks. Ich bekomme den ScanCode nicht ausgewertet. Nur "Change" funktioniert....
OK, also als DOIF
([ESPEasy_SWZ1_Touch:ScanCode] == 2) (set SonoffWZ2 toggle)
tut es... augenscheinlich. Ist nur träge. Notify wäre mir aber lieber...
Als Notify musst du vermutlich sowas machen wie unten gezeigt
(als Beispiel mal meine Außenlichtsteuerung).
Du reagierst im Notify- Regex erstmal auf alles, was vom Tastenfeld
reinkommt. Danach wertest du in Perl den Inhalt von $EVENT aus
und reagierst darauf mit dem entspr. Set- Befehl.
Im Beispiel ist es etwas anders: Ich reagiere hier auf $NAME und das
Event ist immer "on".
Am Besten nutzt du dazu die auskommentierte "Log1"- Zeile, die dir
ins Log schreibt, was rein kommt.
Bei deinen Versuchen hast du übrigens noch ESPEasy_SWZ1_Touch:ScanCode.2 set SonoffWZ2 toggle
vergessen. Vielleicht geht das. Um sowas herauszubekommen gibt es den Eventmonitor.
Sens_BM_1.motion:.on.*|Sens_BM_2.motion:.on.* {
my $bright = (ReadingsVal("Sens_BM_1", "brightness", "---"));
# Log 1, "Name:$NAME ; Event:$EVENT" ;
if ($bright <= 100) {
if ($NAME eq "Sens_BM_1") {
fhem("set Beleuchtung_Gar_03,Beleuchtung_Gar_04 on-for-timer 180");
}
if ($NAME eq "Sens_BM_2") {
fhem("set Beleuchtung_Gar_04,Beleuchtung_Gar_03 on-for-timer 180");
}
}
if (($bright >= 100) and Value("Beleuchtung_Gar_04") eq "undef") {
fhem("set Beleuchtung_Gar_04,Beleuchtung_Gar_03 off");
}
}
Zitat von: fiedel am 18 Februar 2018, 09:52:24
Bei deinen Versuchen hast du übrigens noch ESPEasy_SWZ1_Touch:ScanCode.2 set SonoffWZ2 toggle
vergessen. Vielleicht geht das. Um sowas herauszubekommen gibt es den Eventmonitor.
Nee, ich habe nur nicht alle Versuche dokumentiert ;)
Also mit Perl-Code im Notify greife ich wohl doch lieber auf mein DOIF zurück. Ich meine es ist ja immerhin was, was funktioniert. Aber danke dafür!
notify macht weniger Systemlast ;o)
Also ich würde auch erstmal im Event-Monitor gucken, WAS genau ankommt ...
Da kommt in der Tat sowas an:
2018-02-18 17:53:56 ESPEasy ESPEasy_SWZ1_Touch ScanCode: 32768
Blöd, dass er statt "1" ein "on" annzeigt (und ein "off" bei 0)...
Kann ich mein Doif so basteln?
define blabla doif ([ESPEasy_SWZ1_Touch:ScanCode] == 32768) (set ESPEasy_SWZ1_Touch oledframedcmd on,define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off) doelseif ([ESPEasy_SWZ1_Touch:ScanCode] == 2) (set SonoffWZ2 toggle,set ESPEasy_SWZ1_Touch oledframedcmd on,define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off) ......
usw?
wie macht man am Besten ein mehrzeiliges doif, doelseif, doelseif,.... ? Muss man da was beachten?
würde ich dann so machen so lange ich keine Notify-Lösung habe... Oder lieber einzelne DOIFs?
Damit Ihr wisst, was das wird, hier mal ein sehr Prototypiges Bild (Soll später Glas werden). Leider muss ich irgendwie noch die Empfindlichkeit vom Touchfeld pimpen, mir fehlt ein zehntel Millimeter, daher der grobe, blöde Ausschnitt...
warum erstellt du dir das notify nicht mit Hilfe des Eventmonitors, wenn du das "lieber als DOIF" nutzen willst....
define ntfy_whatever notify ESPEasy_SWZ1_Touch:ScanCode.* {
if ($EVTPART1 eq "on" ) fhem ("set bla 123");
if ($EVTPART1 == 2 ) fhem ("set bla asdf");
if ($EVTPART1 == 32768 ) fhem ("set bla xyz");
...
}
Zitat von: MAC66666 am 17 Februar 2018, 20:37:37
readings: ScanCode. Der lautet off, on, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16636 oder 32768 ;)
16636 ? das glaube ich nicht!
16384 glaube ich sofort :)
Ist halt Pearl... Aber vieleicht mache ich es so ;D
Zitat von: nils_ am 19 Februar 2018, 08:52:12
16636 ? das glaube ich nicht!
16384 glaube ich sofort :)
Ähm, Du hast Dir echt jede einzelne Zahl angeschaut? Da hat mich kurz die Mathematik verlassen :P
Ansonsten wirklich mal im Event-Monitor die Zeile markieren udn auf dem Knopf "Notify generieren" (o.Ä.) drücken ....
Zitat von: MAC66666 am 19 Februar 2018, 09:25:58
Ist halt Pearl... Aber vieleicht mache ich es so ;D
Perl.... ohne A :P :P :P
Zitat von: MAC66666 am 19 Februar 2018, 09:25:58
Ähm, Du hast Dir echt jede einzelne Zahl angeschaut? Da hat mich kurz die Mathematik verlassen :P
das fällt einem schon auf das die reihe da nicht so aussieht wie man sie kennt und gewohnt ist. :D
Bin irgendwie neben der Spur. Natürlich Perl ohne a ;D
Und ja, ich habe diese Zahlen auch immer vor mir, weiß nicht was mich da geritten hat...
Schon zwei Patzer bei Selbsverständlichkeiten in diesem Threat, ich sollte mich mal untersuchen lassen ???
Der meckert meine geschweiften Klammern an:
define TouchWZ1 notify ESPEasy_SWZ1_Touch:ScanCode.* {
if ($EVTPART1 eq "on" ) {
fhem ("set SonoffWZ2 toggle,set SonoffWZ1 toggle,set ESPEasy_SWZ1_Touch oledframedcmd on,define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");}
if ($EVTPART1 == 32768 ) {
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on,define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
}
Habe als noch Syntaxprobleme
zuerst nimmt er das notify so nicht wie oben beschrieben:
Missing right curly or square bracket at (eval 29142) line 1, at end of line
syntax error at (eval 29142) line 1, at EOF
Unknown command }, try help.
Unknown command }, try help.
Und weitere Frage:
muss ich die "sets" durch Komma, Semikolon oder Doppelsemikolon trennen?
Nur mal "Kuransicht":
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on,define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
zwischen FHEM-Befehle kommt ein ; hier hast Du ein "," ...
Danke. Syntax ist immer noch Murks
Ach das funzt wieder mal alles nicht.
Bin jetzt noch mal zurück zu meinem DOIF, da habe ich aber auch Probleme:
ohne do always macht er es immer nur einmal. Mit Do always (hab ja toggle drin) vibriert quasi das Relais des Lichtes...
nur daraus werde ich nicht schlau, löst das mein Problem? :
Zitatwait
Das Attribut verzögert die Befehlsausführung, nach wahr werden einer Bedingung.
Laufende Wait-Timer werden bei einem eingeleiteten Statuswechsel des DOIF abgebrochen, daher werden die zu verzögernden Befehle nicht mehr ausgeführt.
do resetwait
Das Attribut beinhaltet do always, bricht aber die Wait-Timer bei wiederholtem Wahrwerden der Bedingung ab.
hi, ein beispiel wie klammern, if, und kommas gesetzt werden damit es funktioniert ... entsprechend umbauen und deines mit 8 werten sollte funktionieren,.
dy_test1:* { if ($EVENT eq "on") {
fhem ("set dy_test2 on");
fhem ("set dy_test3 on");
}
if ($EVENT eq "off") {
fhem ("set dy_test2 off");
fhem ("set dy_test3 off");
}
}
musst nur $EVENT gegen dein $EVTPART1 ersetzen wie du es oben schon hast
Zitat von: MAC66666 am 19 Februar 2018, 14:47:47
muss ich die "sets" durch Komma, Semikolon oder Doppelsemikolon trennen?
Die Frage wurde oben ja schon mit ; beantwortet, aber noch was zum Stichwort Komma das ich hier sehr selten im Forum als Beispiel sehe :
Du kannst identische Device Kommandos zusammenführen und diese durch Komma trennen
also bei dir statt "set SonoffWZ2 toggle,set SonoffWZ1 toggle, etc"
"set SonoffWZ2,SonoffWZ1 toggle; etc"
Ja, das mit den identischen Devices habe ich scxhon mal gesehen, aber um mich nicht gänzlich zu verwirren, lass ich das bleiben ;)
OK, dann werde ich mal versuchen ein Notify zu basteln.
Eines noch: warum mein Verhalten im DOIF? Mit Wait usw. habe ich das nicht in den Griff bekommen, nur mit einem unschönen sleep 0.4 am Ende Meiner Befehlsreihe...
Brauchst doch nur mein Beispiel abwandeln:
define TouchWZ1 notify ESPEasy_SWZ1_Touch:ScanCode.* {
if ($EVTPART1 eq "on" ) {
fhem ("set SonoffWZ2,SonoffWZ1 toggle");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
fhem ("define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
if ($EVTPART1 == 32768 ) {
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
fhem ("define Disptemp at +00:00:15 set ESPEasy_SWZ1_Touch oledframedcmd off");
}
}
... aber mich macht Pearl auch immer ganz wuschig... ;)
Jep, hatte ich derweil auch schon funktionierend umgesetzt, sieht haargenauso aus ;)
Jetzt geht es bei mir weiter, z. B. will ich bei einem Tastendruck mein Max-Thermostat desiredTemperature um eines erhöhen bzw. verkleinern und einen toggle für ein ESPEasy Relais basteln. Naja, sind andere Baustellen. Das Grundnotify geht endlich, wenn auch mit Perl, aber habe mich dran "gewöhnt" 8)
Danke Leute!
Achso, wenn Ihr Ideen zu meinen weiteren Problemen habt, bitte gerne :)
Mit DOIF kenne ich mich nicht aus ..
aber mal eine Grundsätzliche Frage:
fhem ("set SonoffWZ2,SonoffWZ1 toggle");
fhem ("set ESPEasy_SWZ1_Touch oledframedcmd on");
Warum wird hier 2 Mal FHEM aufgerufen, wenn es auch ein mal geht?
fhem ("set SonoffWZ2,SonoffWZ1 toggle;
set ESPEasy_SWZ1_Touch oledframedcmd on");
Bei Prototypen (und beim experimentieren) kann ich es verstehen, aber in einer Produktivumgebung ist es irgendwann schlechter "Stil" ....
Da hast du Recht, ist nur wegen der Übersichtlichkeit und um zu zeigen, dass auch sowas geht.
Ja dann später vieleicht ;)