(gelöst) DOIF Ansage der Uhrzeit (Stunde:Minuten:Sekunden)?

Begonnen von Rince, 08 Februar 2016, 17:44:09

Vorheriges Thema - Nächstes Thema

Rince

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 @Damian



Hi,

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 Minuten
ZitatReading: 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 los
Zitatt_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?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Damian

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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rince

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?
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rince

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
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Damian

Du hast meinen Tippfehler übernommen:

[Andi_Fahrzeit_Arbeit:Verkehr:[(\d\d)]]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rince

:)
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.
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Rince

#8
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
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

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  ???
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Damian

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

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Ellert

Verwendest Du Text2Speech? Laut Commandref:
ZitatDer Text selbst darf deshalb selbst keine Doppelpunte beinhalten

Rince

#12
@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 ;) )
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)

Rince

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!
Wer zu meinen Posts eine Frage schreibt und auf eine Antwort wartet, ist hiermit herzlich eingeladen mich per PN darauf aufmerksam zu machen. (Bitte mit Link zum betreffenden Thread)