So, eine Sache läuft jetzt stabil und mit sehr hohem WAF: Spülmaschine mit einem Tastendruck oder einem Sprachbefehl komplex programmieren.
Erste Komponente: Die oben gepostete "inoffizielle" Version des 48_HomeConnect.pm.
Zweite Komponente: Ein Dummy "Geschirrspuelen" mit Attributen
defaultProgram Eco50
readingList active
setList EndTime:time StartTime:time RelativeTime:time Program
userattr defaultProgram
Dritte Komponente: Ein DOIF mit der Definition
([SNxxx:".*BSH.Common.EnumType.OperationState.Finished.*"])
({speak("TText yyy",":130:")},
{speak("Tab1.EG",":130:")},
setreading SNxxx msgAll derzeit nicht)
DOELSEIF
([Geschirrspuelen:".*Time.*"] and [SNxxx] ne "Ready")
(set SNxxx powerOn,
{Log 1,"=======> Powering on SNxxx"},
setreading Geschirrspuelen event $EVENT,
setreading Geschirrspuelen active wait)
DOELSEIF
( ([Geschirrspuelen:event] =~ /RelativeTime.*/ and [SNxxx:".*Ready.*"]) or ([Geschirrspuelen:".*RelativeTime.*"] and [SNxxx] eq "Ready") )
(set SNxxx selectProgram Eco50,
{Log 1,"=======> Selecting Eco50 on SNxxx"})
(set SNxxx requestProgramOptions,
{Log 1,"=======> Requesting options from SNxxx"})
(set SNxxx delayRelative {(my @evt = split(/ /,ReadingsVal("Geschirrspuelen","event",""));;Log 1,"=======> Setting SNxxxto relative delay $evt[1]";;return $evt[1])} )
(setreading Geschirrspuelen active start)
DOELSEIF
(([Geschirrspuelen:event] =~ /EndTime.*/ and [Sxxx:".*Ready.*"]) or ([Geschirrspuelen:".*EndTime.*"] and [SNxxx] eq "Ready"))
(set SNxxx selectProgram Eco50,
{Log 1,"=======> Selecting Eco50 on SNxxx"})
(set SNxxx requestProgramOptions,
{Log 1,"=======> Requesting options from SNxxx"})
(set SNxxx delayEndTime {(my @evt = split(/ /,ReadingsVal("Geschirrspuelen","event",""));;Log 1,"=======> Setting SNxxx to endtime delay $evt[1]";;return $evt[1])} )
(setreading Geschirrspuelen active start)
DOELSEIF
(([Geschirrspuelen:event] =~ /StartTime.*/ and [SNxxx:".*Ready.*"]) or ([Geschirrspuelen:".*StartTime.*"] and [SNxxx] eq "Ready"))
(set SNxxx selectProgram Eco50,
{Log 1,"=======> Selecting Eco50 on SNxxx"})
(set SNxxx requestProgramOptions,
{Log 1,"=======> Requesting options from SNxxx"})
(set SNxxx delayStartTime {(my @evt = split(/ /,ReadingsVal("Geschirrspuelen","event",""));;Log 1,"=======> Setting SNxxx to starttime delay $evt[1]";;return $evt[1])} )
(setreading Geschirrspuelen active start)
DOELSEIF
([Geschirrspuelen:active] eq "start" and [Sxxx:".*BSH.Common.Option.StartInRelative.*"] )
(set SNxxx startProgram,
{Log 1,"=======> Delayed start SNxxx"})
(setreading Geschirrspuelen event -,
setreading Geschirrspuelen active no)
und Attributen
do always
wait 0:0:5,10,10,2:5,10,10,2:5,10,10,2:0
Mit diesen Komponenten läuft das schon so:
set Geschirrspuelen endTime 06:00 => Spülmaschine wird hochgefahren, Programm ausgewählt und die Startverzögerung so eingestellt, dass die Kiste um 6:00 in der Frühe fertig ist.
set Geschirrspuelen startTime 17:00 => Spülmaschine wird hochgefahren, Programm ausgewählt und die Startverzögerung so eingestellt, dass die Kiste um 17:00 startet
set Geschirrspuelen relativeTime 02:00 => Spülmaschine wird hochgefahren, Programm ausgewählt und die Startverzögerung so eingestellt, dass die Kiste in 2 Stunden startet.
Und sich danach mit einer Sprachausgabe meldet (:130: ist der Code für eine vor-aufgenommene Nachricht "Die Spülmaschine ist fertig"), die einmal über ein wandhängendes Tablet ausgegeben wird und zweitens meiner Chefin auch als Telegram-Nachricht gesendet wird. Der Start wird natürlich meiner Chefin auch in einem Telegram-Keyboard angeboten, so dass das mit _einem_ Knopf auf dem Handy geht.
Vierte Komponente: Ein Eintrag für den entsprechenden Dialog in meinem RiveScript-Chatbot (der Bestandteil des Moduls Babble ist):
//########################################################################################
//# Spülmaschine
//########################################################################################
+ (starte|schalte|mach) die spülmaschine um * uhr [an]
- OK, ich starte die Spülmaschine um <star2> Uhr
^ <call>startdishwasher <star2></call>
+ (dass|lass|lasse) die spülmaschine laufen (bis|um) [um] * uhr
* <star2> == bis => OK, ich lasse die Spülmaschine laufen bis um <star3>
^ <call>stopdishwasher <star3></call>
* <star2> != bis => OK, ich lasse die Spülmaschine laufen um <star3>
^ <call>startdishwasher <star3></call>
+ (dass|lass|lasse) die spülmaschine [laufen] über nacht [laufen]
- OK, ich lasse die Spülmaschine laufen bis um 6 Uhr
^ <call>stopdishwasher 6:00</call>
+ (starte|schalte|mach) die spülmaschine (sofort|jetzt) [an]
- OK, ich starte die Spülmaschine sofort
//object for delayed start of dishwasher
> object startdishwasher perl
my $rs = shift;
my $st = join(" ",@_);
$st =~ s/(\d?\d)\suhr\s(\d?\d)/$1\:$2/;
$st =~ s/^(\d?\d)$/$1\:00/;
main::Log 1,"[rive] startdishwasher $st";
main::fhem("set Geschirrspuelen StartTime $st");
< object
//object for delayed stop of dishwasher
> object stopdishwasher perl
my $rs = shift;
my $st = join(" ",@_);
$st =~ s/(\d?\d)\suhr\s(\d?\d)/$1\:$2/;
$st =~ s/^(\d?\d)$/$1\:00/;
main::Log 1,"[rive] stopdishwasher $st";
main::fhem("set Geschirrspuelen EndTime $st");
< object
Et voilà: Mit den Sprachbefehlen
"Hallo Jeannie" <pling, Tablet wartet auf Spracheingabe>
"Lass die Spülmaschine über Nacht laufen" <Jeannie antwortet mit Sprachausgabe "OK, ich lasse die Spülmaschine laufen bis um 6 Uhr">
wird die Kiste so gestartet, dass sie um 6:00 fertig ist.
LG
pah