FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: sengelking am 22 Februar 2016, 19:05:24

Titel: FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: sengelking am 22 Februar 2016, 19:05:24
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
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: Dr. Boris Neubert am 22 Februar 2016, 19:06:47
Was meinst Du mit "verarbeitet"? Was meinst Du mit "nochmal abarbeiten"?
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: sengelking am 22 Februar 2016, 19:14:20
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"
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: Dr. Boris Neubert am 22 Februar 2016, 19:39:37
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
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: sengelking am 22 Februar 2016, 20:02:27
Hallo,
wie ich die Ereignisse kriege ist mir klar, die Frage ist, wie ich dass dann am besten verarbeiten kann
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: Dr. Boris Neubert am 22 Februar 2016, 20:17:16
Tut mir leid, das ist mir zu unspezifisch.
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: sengelking am 23 Februar 2016, 08:26:13
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...
Titel: Antw:FHT bei mode auto Temperatur vom Kalender holen
Beitrag von: sengelking am 26 Februar 2016, 19:24:23
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