Moin Forum,
ich habe eine - vermutlich dumme - DOIF Frage. Ich bastele an meiner Sprachsteuerung per Arduino und MOVI-Shield.
Für meine Squeezebox-Player möchte ich einen Sprach-Befehl "Volume Up" oder "Volume Down" verwenden.
Das klappt auch und ich kann mit einem DOIF auf das vom Arduino ausgelöste Event ("#74") triggern:
define KuecheVolume DOIF ([myArduino1:"#74"])(set Kueche volumeUp)
Die Lautstärke wird in 10er-Schritten angehoben. Das Problem ist, ich kann das nur einmal machen.
Wenn ich den Befehl wiederhole (um lauter zu werden) gibt es das selbe Event ("#74") und das DOIF löst nicht aus.
Nur der timestamp ändert sich.
Kann ich mein DOIF bei gleichem Event mit geändertem timestamp auslösen?
Gruß, Jochen
schau dir mal das attribut "do always" an.
Moin,
"do always" ist gesetzt. Passiert aber nix, nur bei event-Änderung.
Gleiches Event --> DOIF bleibt still.
Gruß, Jochen
Hallo Jochen,
dann mach doch ein notify, ohne viel schnick schnack :D
defmod KuecheVolume notify myArduino1:#74 set Kueche volumeUp
Gruß Otto
Mmm - das notify triggert gar nicht. Ist das Problem eventuell, das ich den state "#74" mit
attr myArduino1 stateFormat { ReadingsVal("myArduino1","UNKNOWNCODE MOVIEvent[202]",0);; }
künstlich herbeiführe? (#74 ist die Satznummer des Movi-Shields)
Mit DOIF ist's kein Problem - halt nur bei sich änderndem event...
Da empfehle ich den den Eventmonitor (https://wiki.fhem.de/wiki/Event_monitor)
Und dann Gerät anlegen lassen 8)
DOIF triggert mit "#74" auf irgendwas mit #74 drin, notify macht es genauer.
stateFormat ändert das Internal STATE und nicht das Reading state!
Gruß Otto
Ok, evt. habe ich ein Verständnisproblem.
"myArduino1" ist ein ("Pseudo")-Jeelink-Device, das bekommt seine Daten via FHEM2FHEM:
https://forum.fhem.de/index.php/topic,83787.msg764246.html#msg764246
Ich habe mal einen Screenshot der relevanten Readings dieses Devices angehängt.
Alle meine Befehle reagieren mit DOIF (und stateFormat) auf das sich ändernde Reading in der Form:
define LampeAn DOIF ([myArduino1:"#23"])(set Lampe on)
Geht super, aber wie gesagt nur bei sich ändernder Satznummer.
Wie würde ich denn die im Bild angezeigten Readings in einem Notify berücksichtigen?
Und nochmal die Frage: kann DOIF (oder notify) sowas wie: "wenn reading gleichbleibend und timestamp anders, dann mach das nochmal" ?
Sorry, mit dem Bild kann ich nix anfangen.
Ein
list myArduino1
würde eventuell helfen.
DOIF in der hier gezeigten Form macht laut Doku dies hier
ZitatEine Alternative zur Auswertung von Status oder Readings ist das Auswerten von Ereignissen (Events) mit Hilfe von regulären Ausdrücken. Der Suchstring wird als regulärer Ausdruck in Anführungszeichen angegeben. Die Syntax lautet: [<devicename>:"<regex>"]
Was bei Dir wirklich an Events kommt siehst Du im Event Monitor, was dort nicht kommt existiert nicht.
Ein notify reagiert nur auf Events, und zwar exakt auf die die man im regEx angibt.
Gruß Otto
Hier das Ergebnis von "list myArduino1" (auf den Kram von heute beschnitten):
Internals:
CHANGED
Clients :PCA301:EC3000:RoomNode:LaCrosse:ETH200comfort:CUL_IR:HX2272:FS20:AliRF:Level:EMT7110:KeyValueProtocol
DEF /tmp/jdummy@directio
DeviceName /tmp/jdummy@directio
NAME myArduino1
NR 1345
PARTIAL
STATE #74
TYPE JeeLink
Matchlist:
1:PCA301 ^\S+\s+24
2:EC3000 ^\S+\s+22
3:RoomNode ^\S+\s+11
4:LaCrosse ^(\S+\s+9 |OK\sWS\s)
5:AliRF ^\S+\s+5
6:EMT7110 ^OK\sEMT7110\s
7:KeyValueProtocol ^OK\sVALUES\s
Readings:
2018-03-20 17:27:24 UNKNOWNCODE MOVIEvent[140] ACTIVELISTEN
2018-03-20 17:27:27 UNKNOWNCODE MOVIEvent[141] END ACTIVELISTEN
2018-03-20 17:27:32 UNKNOWNCODE MOVIEvent[150] SPEAKING
2018-03-20 17:27:32 UNKNOWNCODE MOVIEvent[151] END SPEAKING
2018-03-20 17:27:24 UNKNOWNCODE MOVIEvent[200] CALLSIGN DETECTED
2018-03-20 17:27:28 UNKNOWNCODE MOVIEvent[201] I KITCHEN VOLUME UP
2018-03-20 17:27:28 UNKNOWNCODE MOVIEvent[202] #74
Attributes:
event-on-change-reading .*
flashCommand avrdude -p atmega328P -c arduino -P [PORT] -D -U flash:w:[HEXFILE] 2>[LOGFILE]
room movi
stateFormat { ReadingsVal("myArduino1","UNKNOWNCODE MOVIEvent[202]",0);; }
ZitatUnd nochmal die Frage: kann DOIF (oder notify) sowas wie: "wenn reading gleichbleibend und timestamp anders, dann mach das nochmal" ?
Das hatte ich die Tage auch gerade und wenn ich dich richtig verstehe fehlt bei deinem ersten DOIF nur ein :
attr KuecheVolume checkReadingEvent 1
Gruß
Thomas
ZitatDOIF in der hier gezeigten Form macht laut Doku dies hier
Zitat
Eine Alternative zur Auswertung von Status oder Readings ist das Auswerten von Ereignissen (Events) mit Hilfe von regulären Ausdrücken. Der Suchstring wird als regulärer Ausdruck in Anführungszeichen angegeben. Die Syntax lautet: [<devicename>:"<regex>"]
Genau - das ist mir bekannt. Ich kann z.B. auch auf RAW-Messages triggern z.B.:
define forecast_act DOIF ([myArduino1:&RAWMSG] =~ "wetter") (set wetterdummy on)
Ich könnte auch auf "VOLUME UP" (so steht es im Event-Monitor) reagieren, es ändert nur nichts.
Das Event bleibt ja gleichlautend (Volume Up, Volume Up) und das DOIF bleibt still.
Dazwischen ein "Lampe an" (#23) und ich kann wieder ein "Volume UP" (#74) machen. :)
ZitatDas hatte ich die Tage auch gerade und wenn ich dich richtig verstehe fehlt bei deinem ersten DOIF nur ein :
Code: [Auswählen]
attr KuecheVolume checkReadingEvent 1
Hab's gerade probiert, das ändert leider nichts.
ok, da hilft nur der Eventmonitor,
Wie im Link beschrieben:
Erzeuge den Event mit #74, markiere den Event und lass Dir ein notify erzeugen.
So würde ich zumindest vorgehen...
Gruß Otto
P.S. ich denke dein STATE (stateFormat) erzeugt keinen neuen Event mit #74 weil sich das Reading nicht ändert (event-on-change-reading)
Hallo Otto,
aaaaah - jetzt habe ich auch begriffen, wie Du das meinst:
ZitatDa empfehle ich den den Eventmonitor
Und dann Gerät anlegen lassen 8)
Sorry, lange Leitung - ich wusste gar nicht, dass das geht. Muß jetzt erstmal "außer Haus", poste aber kurzfristig das Ergebnis.
Erstmal schonmal Danke!
Gruß, Jochen
So, da bin ich wieder.
In meinem Event-Monitor kann ich den button "create device" nicht finden (siehe Foto).
Ich kann aber ein Device vorher anlegen und dafür dann ein "addRegexpPart" machen.
Das so erstellte notify funktioniert aber genausowenig.
Ist mein Event-Monitor evt. nicht aktuell? Sooo alt ist meine FHEM-Installation auf dem NUC nicht...
Gruß, Jochen
Der Eventmonitor hat dieses Feature vielleicht seit einem Jahr?
Dann zeig doch mal die Events wo #74 vorkommt.
Gruß Otto
Otto - hat sich soeben erledigt...
Man kann ruhig doof sein, man muß sich nur zu helfen wissen. 8)
Ich habe es den Arduino regeln lassen.
Ich gebe einfach eine Zeile über die serielle Schnittstelle aus, auf die getriggert werden kann.
Danach schreibe ich direkt nochmal etwas anderes über seriell.
So sieht es im Arduino-Sketch aus:
if (res==75) { // Sentence 74
digitalWrite(led, HIGH);
recognizer.say("Volume goes up!");
Serial.println("up_on");
Serial.println("up_off");
delay(3000);
digitalWrite(led, LOW);
}
if (res==76) { // Sentence 75
digitalWrite(led, HIGH);
recognizer.say("Volume goes down!");
Serial.println("down_on");
Serial.println("down_off");
delay(3000);
digitalWrite(led, LOW);
}
jetzt triggert mein DOIF auf den state, nicht auf den STATE (richtig so?):
define KuecheVolume DOIF([myArduino1:state] eq "UNKNOWNCODE up_on") (set Kueche volumeUp)
Und weil direkt danach auf "UNKNOWNCODE up_off" gewechselt wird, ist das DOIF sofort wieder bereit für das nächste "Volume up".
Trotzdem wäre es interessant zu wissen, ob der timestamp als DOIF-trigger verwendet werden kann.
Erstmal Danke und Gruß, Jochen
Achso: PS - kann ich den Eventmonitor einzelnd updaten? Ich kann das Modul irgendwie nicht finden. Vor einen kompletten FHEM-Update habe ich großen Respekt, das hat mir schonmal einiges zerhagelt. Dafür ist mein setup inzwischen zu komplex ;D
Zitat von: joginet am 20 März 2018, 21:46:46
Achso: PS - kann ich den Eventmonitor einzelnd updaten? Ich kann das Modul irgendwie nicht finden. Vor einen kompletten FHEM-Update habe ich großen Respekt, das hat mir schonmal einiges zerhagelt. Dafür ist mein setup inzwischen zu komplex ;D
Nein. Von solchen Einzel Updates wird dringend abgeraten.
Aber es gibt backup ;D
Gruß Otto
Ich weiss. 8)
Und mein Backup ist sogar einigermaßen aktuell ;D
Ich werde beizeiten mal upgraden, die Möglichkeit der direkten "device-Erzeugung" war mir nicht bekannt und klingt sehr interessant & zeitsparend...
Gruß, Jochen
Zitat von: joginet am 20 März 2018, 15:34:36
Moin Forum,
ich habe eine - vermutlich dumme - DOIF Frage. Ich bastele an meiner Sprachsteuerung per Arduino und MOVI-Shield.
Für meine Squeezebox-Player möchte ich einen Sprach-Befehl "Volume Up" oder "Volume Down" verwenden.
Das klappt auch und ich kann mit einem DOIF auf das vom Arduino ausgelöste Event ("#74") triggern:
define KuecheVolume DOIF ([myArduino1:"#74"])(set Kueche volumeUp)
Die Lautstärke wird in 10er-Schritten angehoben. Das Problem ist, ich kann das nur einmal machen.
Wenn ich den Befehl wiederhole (um lauter zu werden) gibt es das selbe Event ("#74") und das DOIF löst nicht aus.
Nur der timestamp ändert sich.
Kann ich mein DOIF bei gleichem Event mit geändertem timestamp auslösen?
Gruß, Jochen
Das ist ein Fall für DOIF-Perl, dort kann man einen Timer setzen, auf den man selbst reagiert, seine Aktion ausführt (hier Lautstärke erhöhen), einen Zähler erhöht und wieder einen einen Timer setzt. Das Ganze wiederholt man bis eine bestimmte Bedingung erfüllt ist. Ist eine Sache von ein paar Zeilen.
Hallo Damian,
sowas ähnliches hatte ich mir schon gedacht. Ich werde das "for future use" im Hinterkopf behalten.
Im Moment bin ich zufrieden - alles läuft wie gewünscht.
Gruß, Jochen