[aufgegeben] FHEM, OwnCloud (CalDAV) und Slack

Begonnen von Jentaia, 23 Februar 2018, 13:12:40

Vorheriges Thema - Nächstes Thema

Jentaia

Hallo mal wieder,

nachdem ich - auch Dank eurer Hilfe - nun sämtliche Rollos und Heizkörperthermostate und sogar die Steckdose an der Waschmaschine auslesen und steuern kann (ja, es geht langsam vorwärts), habe ich gestern die Tutorials von Matthias gefunden (auch an diesen vielen Dank!) und mich an etwas total Verrücktes herangewagt: Einbinden des OwnCloud-Kalenders und senden einer Nachricht an Slack, wenn ein Termin ansteht. Für die Termine wurde das Modul Abfall gebraucht (auch, wenn ich es nicht ausschließlich für den Abfall verwende).

Es funktioniert auch - so halbwegs. Mein einziges Problem ist, dass die Nachricht so ungefähr 20x in Slack ankommt.

Eintrag aus der Logfile (erscheint vermutlich genauso oft, wie die Nachricht in Slack, obwohl das "-1" vermuten lässt, dass es nicht funktioniert):
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100    87  100     2  100    85      6    274 --:--:-- --:--:-- --:--:--   274
ok2018.02.23 12:30:53 3: KalenderToSlack return value: -1


Und mein Code aus der 99_myUtils.pm:
sub KalenderSlack ($)
{
my $status = 0;
my $tageUebrig = ReadingsVal("Termine","next_days","");

    my $messageText = ReadingsVal("Termine","next_text","");
my $messageURL = "https://hooks.slack.com/services/geheim1/geheim2/geheim3";
my $messagePayloadStart = '"payload={\"username\": \"FHEM-Bot\", \"text\": \"';
my $messagePayloadEnde = '\"}"';
my $message = $messagePayloadStart . $messageText . $messagePayloadEnde . " " . $messageURL;

    if ($tageUebrig <= 3 && $status == 0) {
       system("curl -X POST --data-urlencode" . " " . $message);
   $status = 1;
    };

}


Die Variable $status habe ich natürlich nur eingefügt, weil ich "dachte", ich könnte damit das mehrfache Versenden umgehen. Aber nö. Der Sub wird offensichtlich mehrfach aufgerufen.

Der Code wird aus einem Notify aufgerufen, in dessen DEF folgendes steht:
DEF
Termine:next.* { KalenderSlack("$EVENT"); }


Falls es jemanden interessiert: In Slack kann man verschiedene Kanäle anlegen und jedem Kanal einzeln diverse "Apps" hinzufügen. Meine hier verwendete App heißt "Eingehende Webhooks".
(Und Slack ist das gleiche wie WhatsApp, nur ohne Telefonnummer, stattdessen mit E-Mail-Registrierung).

Ich hoffe, einem der Profis fällt auf, wo mein Fehler ist.
Außerdem nehme ich auch gerne Hinweise auf, die alles schöner, kürzer oder syntaktisch korrekter machen ;D

Lieben Gruß

Jentaia

betateilchen

Zitat von: Jentaia am 23 Februar 2018, 13:12:40
Ich hoffe, einem der Profis fällt auf, wo mein Fehler ist.

Das DEF in Deinem notify triggert auf zuviele events (genauer gesagt: auf JEDEN) deshalb darfst Du Dich nicht wundern, dass 20 Nachrichten verschickt werden.
Passe die regexp dort an, und alles wird gut.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Jentaia

#2
Hallo Betateilchen,

vielen Dank für deine schnelle Antwort.

Mal für ganz Doofe wie mich, die keine Erfahrung mit regulären Ausdrücken haben:
Das Notify soll auf ALLE Termine reagieren, die so im Kalender eingetragen werden. Aber nur 1x pro Termin. Es reagiert 20x auf den EINEN Termin. Wie mache ich es jetzt, dass ein beliebiger Termin nur 1x auftaucht (aber trotzdem zwei Termine gesendet werden, falls z.B. die rote Tonne und die gelbe Tonne gleichzeitig anfallen)?

Oder muss ich jetzt für jeden Termin ein eigenes Notify erstellen? Der Termin beim Arzt, beim Notar, drei Mülltonnen...


Edit:
Ich habe mich etwas mehr mit dem Abfall-Modul beschäftigt. Mein Notify soll ja nur den "next" - also den nächsten Termin ausgeben.

Wie ich es auf Github verstanden habe, soll es eine Trennung zwischen mehreren Terminen am selben Tag geben:
Zitatdelimiter_text_reading

if more than one event exist on the same day, this is the delimiter to join these events only for the readings next_text, next_location, next_description, now_text, now_location and now_description

Deshalb habe ich spaßeshalber mal mehrere Termine erstellt. Das Ergebnis ist aber das gleiche: Nur EIN Termin wird als "next" angezeigt und dieser wird (ich habe nachgezählt) 35 Mal an Slack gesendet.

Lieben Gruß

Jentaia

Jentaia

Jetzt existiert ein Dummy und auf Slack kommt gar nichts mehr an. Wenn ich es mal geschafft habe, dass etwas durchkommt, sind es wieder die vollen 35 Einträge, sonst nichts.
Im Notify steht jetzt das gleiche, nur ohne das ".*". Ich habe nach wie vor keine Ahnung von regulären Ausdrücken (so wie ich das verstehe, ein viel zu komplizierter Filter), geschweige denn, was ich hier wie anwenden könnte. Ich will überhaupt nichts filtern. Es soll nur ein einziges Mal pro auslösen des Notifys eine Meldung auf Slack geben.

Ich glaube, ich lege Slack und den ganzen Terminkrempel auf Eis. Fhem erwähnt jetzt selbst nach einem Neustart nicht mehr, dass da irgendwas wäre.