FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Kohle77 am 07 Februar 2021, 11:44:38

Titel: DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Kohle77 am 07 Februar 2021, 11:44:38
Hallo,
ich brauch mal wieder Hilfe. Also ich habe einen Kalender und ein SiSi device sowie roommates.
Jetzt habe ich ein DOIF gebaut das so aussieht:

([11:28] and [Geburtstagsliste:t_001_daysleft] == 1)
( {my $val= ReadingsVal ('Geburtstagsliste','t_001_summary','');;
my $t= ReadingsVal ('Geburtstagsliste','t_001_description','');;
my $rec= substr("$t",0,1);;
fhem ("set Signal msg @###Gruppen-ID####== Morgen hat $val Geburtstag und $rec")
} )


Darin habe ich die beiden Variablen $val und $rec. In Val wird der Name desjenigen der Geburtstag hat. In Rec speicher ich den ersten Buchstaben der in dem reading t_001_description steht was die Werte M,C oder B haben kann (oder eben leer).

Ich möchte das ganze nun mit if, elseif und else ausbauen aber irgendwie bekomme ich da nicht hin. Dazu habe ich folgendes gebastelt was aber in einem error endet.


([16:28] and [Geburtstagsliste:t_001_daysleft] == 1)
( {my $val= ReadingsVal ('Geburtstagsliste','t_001_summary','');;
my $t= ReadingsVal ('Geburtstagsliste','t_001_description','');;
my $rec= substr("$t",0,1);;
if ($rec eq "m") {fhem ("set Signal msg @rr_Bewohner1 Morgen hat $val Geburtstag")}
elsif ($rec eq "c") {fhem ("set Signal msg @rr_Bewohner2 Morgen hat $val Geburtstag")}
else {fhem ("set Signal msg @###Gruppen-ID####== Morgen hat $val Geburtstag")}
})


Ich kann aus der FHEM zeile mit
Zitatmsg rr_Bewohner1 Das ist ein test
eine Nachricht schicken an den Bewohner eins und dieser erhält dann
Zitatrr_Bewohner1 Das ist ein test
. Warum er das rr_Bewohner1 auch erhät verstehe ich nicht aber das ist auch erstmal egal. Viel wichtiger wäre für mich wenn das if, elseif und else funktionieren würde.

Hat da jemand villeicht einen Tip wie ich das ans laufen bekomme?

Gruß
Christian
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: betateilchen am 07 Februar 2021, 12:20:28
Zitat von: Kohle77 am 07 Februar 2021, 11:44:38
Warum er das rr_Bewohner1 auch erhät verstehe ich nicht

Vielleicht, weil rr_Bewohner1 in diesem Kontext wie ein normaler Text aussieht und deshalb alles was nach "msg" steht, an den default-Empfänger verschickt wird?
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Damian am 07 Februar 2021, 12:25:28
Du hast hier mindestens 90 % Perlcode. Warum definierst du es im FHEM-Modus und nicht gleich im Perlmodus? Dort kannst du dich beliebig mit if-elsif... austoben.

https://fhem.de/commandref_DE.html#DOIF_Perl_Modus

Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: betateilchen am 07 Februar 2021, 12:40:47
und wenn es schon ein ical Kalender ist - warum nimmt man für sowas nicht das Calendar Modul?
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Kohle77 am 08 Februar 2021, 07:30:01
Hi,
erstmal danke.
Also ja ich habe ein calendar in dem ich den ical file einlese.
Diesen calendar benutze ich dann im calview (so hatte ich es verstanden bisher) um die Geburtstage irgendwie in vernünftige lesbare readings zu bekommen.
@betateilchen ja das dachte ich mir auch schon das eben rr_Bewohner als text erkannt wird und der default Empfänger das dann erhält aber wie bekomme ich es hin das es eben kein text ist sondern der Empfänger?

Ich habe es mal so probiert:

([07:15] and [Geburtstagsliste:t_001_daysleft] == -1)
( {my $val= ReadingsVal ('Geburtstagsliste','t_001_summary','');;
my $t= ReadingsVal ('Geburtstagsliste','t_001_description','');;
my $rec= substr("$t",0,1);;
if ($rec eq "m") fhem_set "msg @rr_Bewohner1 Morgen hat $val Geburtstag";;
elsif ($rec eq "c") fhem_set "msg @rr_Bewohner2 Morgen hat $val Geburtstag";;
else fhem_set "msg @###Gruppen-ID####== Morgen hat $val Geburtstag" })


aber da stimmt was nicht mit den Klammern.

Danke
Christian
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Otto123 am 08 Februar 2021, 09:57:52
Hallo Christian,

ich verstehe momentan weder den Betreff noch den text wirklich. Aber mir fällt auf:

Perl if Syntax: if(Bedingung){Ausführung} diese Klammern sind wichtig, ohne wird der Syntax nicht stimmen.
if ($rec eq "m") {fhem ("set Signal msg @rr_Bewohner1 Morgen hat $val Geburtstag")}
Zeichen wie $ und @ innerhalb von "diesen Klammern" werden aufgelöst weil sie als Variable verstanden werden. Soll das nicht passieren muss man sie schützen.
Ich kenne den  msg Syntax nicht, aber eventuell musst Du einfach \@rr_Bewohner1 schreiben, damit der Klammeraffe weitergegeben wird? Bei Email Adressen innerhalb von " " -> "user@domain.de" muss man es so tun. ->  "user\@domain.de"

Ich verstehe auch immer nicht, warum man das Calendar Modul nur dazu nimmt einen Kalender mit Calview anzuzeigen - den man doch viel besser im Originalkalender anschauen kann? :) Man will doch in einer Automatisierung nicht das gleiche anzeigen was es schon gibt, man will doch verarbeiten? ::)
Das Calendar Modul für sich kann mit etwas Code sicher genau das machen was Du lösen willst, was ich allerdings wirklich nicht verstanden habe.

Ein Funktion nachzuprogrammieren, die eigentlich jeder Kalender hat (3 Tage vorher oder am Vortag eine Info über anstehende Geburtstage zu liefern) erschließt sich mir auch nicht, aber die soll es wohl sein?
Ich würde zwei userReadings im Calendar Device anlegen,die die Geburtstage auswerten: ein Reading für verbleibende Tage und Eines mit der Info wer hat Geburtstag. Dann kann man mit einem notify oder at darauf reagieren.

Ich habe einen Kalender (Calendar Device - kein Calview) wo nur die Termine drin sind die ich brauche, ich muss also nicht weiter filtern (was man auch machen kann).
attr Kalender userReadings nextDays {my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);;\
             if (!defined $zeit) {$zeit=0} \
             my $day = int(($zeit + 86399 - time)/86400);;\
             $day?eval{$day>1?$day:"morgen"}:"heute"},\
Termin {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1)}

Sollte Dir die Tage (bzw. morgen und heute) bis zum nächsten Termin und dessen Name anzeigen.

Gruß Otto
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Kohle77 am 08 Februar 2021, 10:55:25
Hallo Otto and others,
ich kann leider nur ein bisschen programmieren. Habe es jetzt mal so umgesetzt und es funktioniert.
Werde mir später mal anschauen was Otto mir geschickt hat.


([08:30] and [Geburtstagsliste:t_001_daysleft] == 1)
( {my $val= ReadingsVal ('Geburtstagsliste','t_001_summary','');;
my $t= ReadingsVal ('Geburtstagsliste','t_001_description','');;
my $rec= substr("$t",0,1);;
if (($rec eq "m") || ($rec eq "M")) {fhem "set Signal msg rr_Bewohner1 Morgen hat $val Geburtstag"}
elsif (($rec eq "c") || ($rec eq "C")) {fhem "set Signal msg rr_Bewohner2 Morgen hat $val Geburtstag"}
else {fhem "set Signal msg \@GroupID== Morgen hat $val Geburtstag"}
})


Danke
Christian
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Kohle77 am 08 Februar 2021, 11:47:03
Hallo Otto,
ich habe mir das mal engeschaut:

attr Kalender userReadings nextDays {my $zeit=fhem('get '.$name.' events format:custom="$t1" limit:from=0,count=1',1);;\
             if (!defined $zeit) {$zeit=0} \
             my $day = int(($zeit + 86399 - time)/86400);;\
             $day?eval{$day>1?$day:"morgen"}:"heute"},\
Termin {fhem('get '.$name.' events format:custom="$S" limit:from=0,count=1',1)}


Wo definierst du den die variable .$name.?
$t1 ist Startzeit in Sekunden

Gruß
Christian
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Otto123 am 08 Februar 2021, 15:28:56
$name ist "im Gerät verfügbar", die musst Du nicht definieren. Ist der Name des Gerätes.
$t1 hast Du richtig gefunden:
ZitatFolgende Variablen können in <formatString> und in <perl-code> verwendet werden:

variable   Bedeutung
$t1   Startzeit in Sekunden
$T1   Startzeit entsprechend Zeitformat
$t2   Endzeit in Sekunden
$T2   Endzeit entsprechend Zeitformat
$a   Alarmzeit in Sekunden
$A   Alarmzeit entsprechend Zeitformat
$d   Dauer in Sekunden
$D   Dauer in menschenlesbarer Form
$S   Zusammenfassung
$L   Ortsangabe
$CA   Kategorien
$CL   Klassifizierung
$DS   Beschreibung
$U   UID
$M   Modus
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Kohle77 am 09 Februar 2021, 08:18:33
Hi,
danke für die Erklärung.
Zu dem ganzen wieso usw.
- Der Kalender ist nicht im www sondern liegt als Datei auf dem fhem server
- Einheitlichen benachrichtigung per SiSi modul für müll oder Geburtstage (Müll ist ein anderes DOIF)

Gruß
Christian
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Otto123 am 09 Februar 2021, 09:36:29
Moin,

ok verstanden. Dann brauchst Du den Calview eventuell zum anzeigen :)
Trotzdem würde ich die Automatisierung direkt im / mit Calendar machen.
Das UserReading was ich Dir gezeigt habe ist ursprünglich von meiner Abfallbenachrichtigung. Die ist quasi zweistufig, die userReadings triggern die Benachrichtigung.
Aber wenn es jetzt einmal funktioniert  ist es auch gut. ;)

Gruß Otto
Titel: Antw:DOIF für Geburtstage aus ical Kalender and verschiedene Benutzer je nach inhalt
Beitrag von: Kohle77 am 09 Februar 2021, 13:14:28
Hi,
ja so sehe ich es auch. Vielleicht probiere ich später im Jahr damit mal weiter rum.
Ich schließe das ganze nun.

Danke
Christian