Hallo,
wenn ein Ereignis zu Ende geht im Kalender, wird dieser bereits durch das Kalendermodul verarbeitet. Nun möchte ich in diesem Schritt zusätzlich nochmal alle Ereignisse die sich im mode=start befinden nochmal abarbeiten, wie könnte ich dies realisieren?
Danke
Was meinst Du mit "verarbeitet"? Was meinst Du mit "nochmal abarbeiten"?
Hier mein derzeitiger Code:
#########Calendar start events handling###############
sub
calstart ($)
{
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $actor = fhem("get cal summary uid=$uid 1");
my $dtemp= fhem("get cal location uid=$uid 1");
my $room= fhem("get cal location uid=$uid 1");
my $oil= fhem("get cal location uid=$uid 1");
my $fhtmode= ReadingsVal("$actor", "mode","?");
my $end= fhem("get cal end uid=$uid 1");
my @ends=split(/\./,$end);
my $endd= $ends[0] + 1;
my $endm= $ends[1];
if (($fhtmode !~ /oliday/) && ($actor =~ /fht/) && (defined $dtemp)) {
fhem("set $actor desired-temp $dtemp");
};
if (($fhtmode !~ /oliday/) && ($actor =~ /fht/) && (not defined $dtemp)) {
fhem("set $actor desired-temp " . ReadingsVal($actor,"day-temp","21.0"));
};
if (($actor =~ /oliday/) && ($room =~ /fht/)) {
fhem("set $room mode holiday holiday1 $endd holiday2 $endm desired-temp 10");
};
if (($actor =~ /oliday/) && ($room !~ /fht/)) {
fhem("set TYPE=FHT mode holiday holiday1 $endd holiday2 $endm desired-temp 10");
};
if (($actor =~ /uto/) && ($room =~ /fht/)) {
fhem("set $room mode auto");
};
if (($actor =~ /uto/) && ($room !~ /fht/)) {
fhem("set TYPE=FHT mode auto");
};
};
}
##########Calendar end events handling##############
sub calend ($) {
my ($Ereignis) = @_;
my @Ereignisarray = split(/.*:\s/,$Ereignis);
my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/;/,$Ereignisteil1);
foreach my $uid (@uids) {
my $actor = fhem("get cal summary uid=$uid 1");
my $fhtmode= ReadingsVal("$actor", "mode","?");
my $room= fhem("get cal location uid=$uid 1");
if (($fhtmode !~ /oliday/) && ($actor =~ /fht/)) {
fhem("set $actor desired-temp " . ReadingsVal($actor,"night-temp","16.0"));
};
if (($actor =~ /oliday/) && ($room =~ /fht/)) {
fhem("set $room mode auto");
};
if (($actor =~ /oliday/) && ($room !~ /fht/)) {
fhem("set TYPE=FHT mode auto");
};
};
}
Und die Notify:
define cal_start notify cal:start:.* {\
calstart("$EVENT");;\
}
attr cal_start room Calendar
################################################################################################################################
define cal_end notify cal:end:.* {\
calend("$EVENT");;\
}
attr cal_end room Calendar
Derzeit wird bspw. beim Beginn eines Ereignisses die Heizung in den holiday mode versetzt. Am Ende wieder auf Auto.
Nun steuere ich die meisten Heizungen nur über Kalender, sprich es ist kein Programm im FHT-80b vorhanden und somit wird bei auto immer in den Nacht Modus geschaltet. Daher würde ich gerne die Ereignisse abrufen die im mode=start stehen und so behandelt als würden sie jetzt anfangen.
Beispiel:
holiday fht_office 01.02.2016 11:00 bis 03.02.2016 09:00
Am Anfang in holiday Modus am Ende in auto Modus
Parallel gibt es aber dieses Ereignis:
fht_office 21 (set temp) 03.02.2016 08:00
Da der Heizkörper aber noch im holiday status ist wird er nicht geschaltet. Am Ende vom holiday bleibt er aber auch "kalt" und wir nicht eingeschaltet. Daher nochmal alle Ereignisse "durchchecken"
Hallo,
Du brauchst das aktuelle Kalendermodul (update!).
Dann kannst Du Dir mit
get cal uid mode=start
die UIDs der Termine beschaffen, die gestartet sind.
Grüße
Boris
Hallo,
wie ich die Ereignisse kriege ist mir klar, die Frage ist, wie ich dass dann am besten verarbeiten kann
Tut mir leid, das ist mir zu unspezifisch.
So, habe nochmal überlegt, ich kann das wahrschienlich einfach erreichen:
Ich würde gerne ein notify machen welches ausgelöst wird wenn eine Heizung in den Modus auto schaltet. Dieser soll dann die Ereignisse aus dem Kalender holen (mit get cal) und dann an den sub calstart übergeben. Wie müsste hier der notify aussehen?
define CalendarAutoMode notify .*mode.*auto {\
my $event = get cal uid mode=start ;;\
calstart("$event");;\
}
Würde das so gehen? Ich bin nicht so gut mit notify und erst nicht wie ich etwas an ein Sub übergebe...
So, ich habe es jetzt geschafft!
Hier meine Lösung.
Erst habe ich ein neues Sub definiert, diese war notwendig wegen dem Split:
#########Calendar auto events handling###############
sub
calauto ($)
{
my ($Ereignis) = @_;
## my @Ereignisarray = split(/.*:\s/,$Ereignis);
## my $Ereignisteil1 = $Ereignisarray[1];
my @uids=split(/\s+/,$Ereignis);
foreach my $uid (@uids) {
Log 1, "calauto uid: $uid";
my $actor = fhem("get cal summary uid=$uid 1");
my $dtemp= fhem("get cal location uid=$uid 1");
my $room= fhem("get cal location uid=$uid 1");
my $oil= fhem("get cal location uid=$uid 1");
my $fhtmode= ReadingsVal("$actor", "mode","?");
my $end= fhem("get cal end uid=$uid 1");
my @ends=split(/\./,$end);
my $endd= $ends[0] + 1;
my $endm= $ends[1];
if (($fhtmode !~ /oliday/) && ($actor =~ /fht/) && (defined $dtemp)) {
fhem("sleep 60;set $actor desired-temp $dtemp");
};
if (($fhtmode !~ /oliday/) && ($actor =~ /fht/) && (not defined $dtemp)) {
fhem("sleep 60;set $actor desired-temp " . ReadingsVal($actor,"day-temp","21.0"));
};
};
Log 1, "calauto Ereignis: $Ereignis";
}
Und hierzu passend ein entsprechendes Notify:
define CalendarAutoMode notify .*mode.*auto {\
my $termin = fhem("get cal uid mode=start") ;;\
calauto("$termin");;\
Log 1, "CalendarAutoMode: $termin" ;;\
}
attr CalendarAutoMode room Calendar
Hiermit scheint es jetzt zu funktionieren