Lösung:
Das Problem:
[StundenplanView:t_001_btime]
Ist im Format XX:YY:ZZ
Stunden:Minuten:Sekunden
Um getrennt an XX und YY zu kommen (und ZZ zu ignorieren);
(say Übrigens geht es um [StundenplanView:t_001_btime:[(\d\d)]] Uhr [StundenplanView:t_001_btime:[...(\d\d)]] los.)
Das nimmt zuerst die ersten 2 Zahlen (XX), dann die nächsten zwei (YY) :)
Danke @DamianHi,
ich versuche grade mir früh morgens einige Informationen ansagen zu lassen;
Internals:
CFGFN
DEF ([06:15|8] or [Ansage] eq "1")
(set .*PLAYER resetTTS)
(say Ich wünsche einen schönen guten morgen.)
(say Draußen hat es [Aussenthermometer:temperature] Grad bei [Aussenthermometer:humidity] Prozent Luftfeuchtigkeit)
(say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr] Minuten zur Arbeit)
(say Übrigens geht es um [StundenplanView:t_001_btime] los.)
(set Ansage 0)
Attributes:
do always
room Bewohner
wait 0,3,5,5,5
Zur Erklärung:
say ist ein cmdalias,
sayTTS cmdlias say .* AS set fhem_SB_PLAYER sayText '$EVENT'
, da mir zum einen die Tipperei auf die Nerven geht, zum anderen, wenn ich das TTS Device mal wechseln möchte, muss ich nur das cmdalias ändern, nicht aber zig Sprachansagebefehle :)
Was cool ist:
Bei der Temperatur wird beim vorlesen automatisch der . durch ein , ersetzt :)
say Draußen hat es [Aussenthermometer:temperature] Grad bei [Aussenthermometer:humidity] Prozent
Was besser sein könnte:
say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr] Minuten zur Arbeit
Wird gesprochen als:
0 und 41 MinutenZitatReading: Verkehr 00.41
Was echt nicht klappt:
say Übrigens geht es um [StundenplanView:t_001_btime] los.
Wird umgewandelt zu:
http://translate.google.com/translate_tts?ie=UTF-8&tl=de&q=%27Uebrigens+geht+es+um+12:35:00+los.%27.&client=tw-ob
0, MP3 Radio
Und klingt so:
Übrigens geht es um losZitatt_001_btime 12:35:00
Wie kann man das lösen?
Ich könnte ein Userreading basteln, welches das "12:35:00" in "12 Uhr 35" umwandelt
Aber dann hat man bei jedem Reading dieses Problem :(
Am coolsten wäre wohl eine Möglichkeit, längere Readings in DOIF selbst zu trennen
In etwa so:
say Übrigens geht es um [StundenplanView:t_001_btime [b]%1 Uhr %2[/b]] los.
Das %1 nimmt die Werte vor dem Seperator, dann kommt ein extra anzugebender Text (Uhr) %2 als Minuten, %3 soll unter den Tisch fallen, daher weggelassen)
Bei dem anderen Beispiel sähe es dann so aus:
say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr [b]%2[/b]] Minuten zur Arbeit
oder
say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr[b] %1 Stunden und %2 Minuten[/b]] zur Arbeit
Any chance?
Zitat von: Rince am 08 Februar 2016, 17:44:09
In etwa so:
say Übrigens geht es um [StundenplanView:t_001_btime [b]%1 Uhr %2[/b]] los.
Das %1 nimmt die Werte vor dem Seperator, dann kommt ein extra anzugebender Text (Uhr) %2 als Minuten, %3 soll unter den Tisch fallen, daher weggelassen)
Bei dem anderen Beispiel sähe es dann so aus:
say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr [b]%2[/b]] Minuten zur Arbeit
oder
say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr[b] %1 Stunden und %2 Minuten[/b]] zur Arbeit
Any chance?
Dann brauchst du wohl das Expertenfeature des Moduls:
say Mein Herr und Meister du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr:[(\d\d)]] Stunden und [meine_Fahrzeit_Arbeit:Verkehr:[...(\d\d)]] Minuten zur Arbeit
Probiere mal aus ;)
Gruß
Damian
Zitatsay du brauchst vermutlich [meine_Fahrzeit_Arbeit:Verkehr[(\d\d)]] Stunden und [meine_Fahrzeit_Arbeit:Verkehr:[...(\d\d)]] Minuten zur Arbeit
Klappt nicht :(
Die ganze Sprachausgabe dieses Befehls wird nicht ausgeführt.
Hilft das weiter ?
http://stackoverflow.com/questions/37732/what-is-the-regex-pattern-for-datetime-2008-09-01-123545
Zitat@Espo: I just have to say that regex is incredible. I'd hate to have to write the code that did something useful with the matches, such as if you wanted to actually find out what date and time the user typed.
It seems like Tom's solution would be more tenable, as it is about a zillion times simpler and with the addition of some parentheses you can easily get at the values the user typed:
(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})
If you're using perl, then you can get the values out with something like this:
$year = $1;
$month = $2;
$day = $3;
$hour = $4;
$minute = $5;
$second = $6;
Other languages will have a similar capability. Note that you will need to make some minor mods to the regex if you want to accept values such as single-digit months.
Wie setzt man das um?
Zitat von: Rince am 08 Februar 2016, 20:06:40
Klappt nicht :(
Die ganze Sprachausgabe dieses Befehls wird nicht ausgeführt.
Hilft das weiter ?
http://stackoverflow.com/questions/37732/what-is-the-regex-pattern-for-datetime-2008-09-01-123545
Wie setzt man das um?
Poste mal list von deiner Definition.
Zitat
Internals:
CFGFN
DEF ([06:15|8] or [Ansage] eq "1")
(set .*PLAYER resetTTS)
(say Ich wünsche einen schönen guten morgen.)
(say Draußen hat es [Aussenthermometer:temperature] Grad bei [Aussenthermometer:humidity] Prozent Luftfeuchtigkeit)
(say Andi du brauchst vermutlich [Andi_Fahrzeit_Arbeit:Verkehr[(\d\d)]] Stunden und [Andi_Fahrzeit_Arbeit:Verkehr:[...(\d\d)]] Minuten zur Schule)
(say Übrigens geht es um [StundenplanView:t_001_btime] los.)
(set Ansage 0)
NAME di_Morgen_Info
NR 14670
NTFY_ORDER 50-di_Morgen_Info
STATE cmd_1
TYPE DOIF
Readings:
2016-02-08 19:54:36 Device Ansage
2016-02-08 19:54:55 cmd_event Ansage
2016-02-08 19:54:55 cmd_nr 1
2016-02-08 19:54:55 cmd_seqnr 6
2016-02-08 19:54:36 e_Ansage_STATE 1
2016-02-08 19:54:55 state cmd_1
2016-02-08 19:51:08 timer_1_c1 09.02.2016 06:15:00|8
2016-02-08 19:54:55 wait_timer no timer
Condition:
0 DOIF_time_once($hash,$hash->{timer}{0},$wday,"8") or InternalDoIf('Ansage','STATE','',AttrVal($hash->{NAME},'notexist',undef)) eq "1"
Days:
0 8
Devices:
0 Ansage
all Ansage
Do:
0:
0 set .*PLAYER resetTTS
1 say Ich wünsche einen schönen guten morgen.
2 say Draußen hat es [Aussenthermometer:temperature] Grad bei [Aussenthermometer:humidity] Prozent Luftfeuchtigkeit
3 say Andi du brauchst vermutlich [Andi_Fahrzeit_Arbeit:Verkehr[(\d\d)]] Stunden und [Andi_Fahrzeit_Arbeit:Verkehr:[...(\d\d)]] Minuten zur Schule
4 say Übrigens geht es um [StundenplanView:t_001_btime] los.
5 set Ansage 0
Helper:
event 1
globalinit 1
last_timer 1
sleepdevice Ansage
sleepsubtimer -1
sleeptimer -1
timerdev Ansage
timerevent 1
triggerDev Ansage
timerevents:
1
triggerEvents:
1
Internals:
0 Ansage:STATE
all Ansage:STATE
Itimer:
Readings:
Realtime:
0 06:15:00
Regexp:
0:
All:
State:
Time:
0 06:15:00
Timecond:
0 0
Timer:
0 0
Timerfunc:
Timers:
0 0
Trigger:
Attributes:
do always
room Bewohner
wait 0,3,5,5,5
Du hast meinen Tippfehler übernommen:
[Andi_Fahrzeit_Arbeit:Verkehr:[(\d\d)]]
:)
Nice.
Mit dem zusätzlichen Doppelpunkt klappt es soweit.
Hast du noch einen Trick die 12:35:00 zu zerlegen in 12 Uhr 35?
(say Übrigens geht es um [StundenplanView:t_001_btime:[(\d\d)...]] Uhr [Andi_Fahrzeit_Arbeit:Verkehr:[...(\d\d)...]]los.)
Klappt nicht.
Zitat von: Rince am 08 Februar 2016, 21:16:58
:)
Nice.
Mit dem zusätzlichen Doppelpunkt klappt es soweit.
Hast du noch einen Trick die 12:35:00 zu zerlegen in 12 Uhr 35?
(say Übrigens geht es um [StundenplanView:t_001_btime:[(\d\d)...]] Uhr [Andi_Fahrzeit_Arbeit:Verkehr:[...(\d\d)...]]los.)
Klappt nicht.
Bei mir schon. Vielleicht liegt es am fehlenden Leerzeichen vor "los".
Es würde aber auch hier schon ausreichen:
(say Übrigens geht es um [StundenplanView:t_001_btime:[(\d\d)]] Uhr [Andi_Fahrzeit_Arbeit:Verkehr:[...(\d\d)]] los.)
Ich glaube ich muss noch das "geheime" Feature in der Commandref aufnehmen.
Leider noch nicht. (Habe deine Zeile kopiert, 1:1)
Die Zeile wird konsequent ignoriert.
Möchtest du einen Logauszug? Wenn ja, welches Level?
Oder hast du das coole Feature in einer DOIF Erweiterung, die noch nicht eingecheckt ist?
Edit sagt:
Jetzt höre ich prinzipiell nur noch den schönen guten morgen (obwohl ich an den anderen Zeilen nix verändert habe). Ist da evtl. das Problem?
Edit 2:
Auf verbose 5 höre ich nur den guten morgen.
Mit verbose 0 läuft es weiter
Egal was ich bei verbose einstelle, es steht nix im Logfile
Ok.
Update
shutdown restart
DOIF disabled, wieder angeworfen...
Jetzt klappt es fast ;)
Übrigens geht es um 12 Uhr 40 los
???
12:35:00
Da ist keine 40 ???
Zitat von: Rince am 09 Februar 2016, 08:54:13
Ok.
Update
shutdown restart
DOIF disabled, wieder angeworfen...
Jetzt klappt es fast ;)
Übrigens geht es um 12 Uhr 40 los
???
12:35:00
Da ist keine 40 ???
Du kannst die Sache zuerst loggen:
({Log 3, "Zeit: [StundenplanView:t_001_btime] Stunden [StundenplanView:t_001_btime:[(\d\d)...]] Minuten [StundenplanView:t_001_btime:[...(\d\d)]]"})
Ich bin mir sicher, dass es nichts mit DOIF-Modul zu tun hat.
Gruß
Damian
Verwendest Du Text2Speech? Laut Commandref:
ZitatDer Text selbst darf deshalb selbst keine Doppelpunte beinhalten
@Ellert
Nein, im Moment nicht. Läuft über Squeezeplug.
Wobei ich grade am überlegen bin, wieder auf Text2Speech umzusteigen ;)
@Damian
Zitat3: Zeit: 12:35:00 Stunden 12 Minuten 35
Du hast völlig recht. Offenbar macht da was auf dem Weg zu den Lautsprechern etwas, das nicht sein sollte.
Ok...
Nach einer Nacht drüber schlafen:
Das ganze ist so eh etwas unflexibel. Da Squeezeplug keine Warteschlange für TTS anbietet, muss man von Hand waits einbauen. Das ist so nicht elegant.
Ein anderer Weg wäre evtl. folgender:
Ich bastle mir mit dem DOIF aus vielen kleinen Dummies einen großen Dummy zusammen. Der dann den fertigen Text enthält. Des kann ich bequem ins Text2Speech Modul jagen.
Also in etwa so:
define Raport_dummy dummy
define Begruessung_dummy dummy
define di_Begruessung DOIF ([05:30]) (set Begruessung_dummy Ich wünsche einen schönen guten Morgen)
DOELSEIF ([11:30]) (set Begruessung_dummy Mahlzeit)
DOELSEIF ([14:00]) (set Begruessung_dummy Ich wünsche einen schönen Nachmittag)
DOELSEIF ([18:00]) (set Begruessung_dummy Guten Abend)
DOELSEIF ([23:00]) (set Begruessung_dummy Was willst du denn mitten in der Nacht von mir?)
Gibt mir einen Begrüßungstext passend zur Tageszeit in einen Dummy.
Nach dem Schema stricke ich mir jetzt verschiedene Dummies:
Fahrzeit_dummy
Arbeit_Anfang_dummy
Temperatur_dummy
Muell_dummy
Klappt es dann in etwa so:
define di_Tagesstatus
([trigger] eq "1")
(set Raport_dummy [Begruessung_dummy] + [Fahrzeit_dummy] + [Temperatur_dummy] + [Muell_dummy])
(say [Raport_dummy])
(set trigger 0)
(Der Vorteil wäre, ich könnte leichter die einzelnen Dummies beeinflussen. Wenn keine Müllabfuhr ist, ist der Dummy eben leer, bzw. er sagt am Vortag, wenn am nächsten Tag was kommt (da die um 6 Uhr schon auf der Matte stehen, eh schlauer ;) )
Gelöst :)
Hab die 40 gefunden.
Die kommen daher:
(say Übrigens geht es um [StundenplanView:t_001_btime:[(\d\d)]] Uhr [Andi_Fahrzeit_Arbeit:Verkehr:[...(\d\d)]] los.)
Richtig ist:
(say Übrigens geht es um [StundenplanView:t_001_btime:[(\d\d)]] Uhr [StundenplanView:t_001_btime[...(\d\d)]] los.)
Danke Damian!