Seite 1 von 1

Müllkalender/ Terminerinnerung per Telegram

Verfasst: 4. Mai 2020 22:18
von Simson
Hallo zusammen,

ich bin ganz neu hier im Forum.

Mit dem Thema OpenHab beschäftige ich mich seit ca. 1 Jahr.

Einige Projekte habe ich auch schon erfolgreich umgesetzt.

Jetzt stehe ich aber vor einem Problem.

Ich habe meinen Google Kalender per CalDav Binding in OpenHab eingebunden.

Auch Telegram läuft super.

Habe auch schon ein paar Regeln erstellt die super funktionieren.

Jetzt aber zu meinen Überlegungen:

Ich möchte gerne wenn ich in Telegram „/müll“ eingebe, dass der nächste Mülltermin per Telegram Nachricht verschickt wird.

Mit ist es bisher aber nur gelungen feste Nachrichten Texte zu versenden also in dieser Form:

sendTelegram(„bot1“,“Hallo Welt“)

Gibt es eine Möglichkeit den Inhalt einer Variablen aus einem Item in diesen Text einzubauen?

Beispiel Item:

String CalDav_Muell „Termin [%s]“ <calendar> { caldavPersonal=„calendar:Muell Type:EVENT eventNr.1 value:Name“ }

Die Nachricht sollte dann aus einem festen und variablen Bestandteil bestehen: <Müllart aus dem Item>„ wird am“ < dann die Variable aus dem Datum Item > „geleert“.

Wäre klasse wenn mir jemand dabei helfen kann.

Schon einmal vielen vielen Dank im Voraus.

Gruß

Simon

Re: Müllkalender/ Terminerinnerung per Telegram

Verfasst: 5. Mai 2020 00:06
von 03chris
Hallo Simson,
wenn Du Telegram Binding nutzt, dann kannst Du
lastMassage Item einlegen

Code: Alles auswählen

String telegramMessage "Telegram Message" { channel = "telegram:telegramBot:bot:lastMessageText" }
das an das Bot gesendete Nachrichten lesen und rulls triggern kann.

Code: Alles auswählen

rule "nächste Mülltermin per Telegram Nachricht"
when    
    Item telegramMessage received update "müll"
then 
        val telegramAction = getActions("telegram","telegram:telegramBot:bot")
        val String telegram_msg = CalDav_Muell.state.toString + " wird am " + CalDav_Date.state.format("%1$td.%1$tm.") + " geleert"
        telegramAction.sendTelegram(telegram_msg)
end
Telegram Aktion kann meines Wissens keine nachrichten lesen.

Re: Müllkalender/ Terminerinnerung per Telegram

Verfasst: 5. Mai 2020 00:41
von 03chris
sendTelegram(„bot1“,“Hallo Welt“)

Gibt es eine Möglichkeit den Inhalt einer Variablen aus einem Item in diesen Text einzubauen?
Du kannst Platzhalter einsetzen. So wird dann die aus dem oberen Beispiel Nachricht wie folgt aussehen:

Code: Alles auswählen

telegramAction.sendTelegram("%s wird am %s geleert", CalDav_Muell.state.toString, CalDav_Date.state.format("%1$td.%1$tm."))
oder für Telegram Aktion:

Code: Alles auswählen

sendTelegram("bot", "%s wird am %s geleert", CalDav_Muell.state.toString, CalDav_Date.state.format("%1$td.%1$tm."))

Re: Müllkalender/ Terminerinnerung per Telegram

Verfasst: 5. Mai 2020 20:22
von Simson
Hallo 03chris,

vielen Dank für den Tipp. Hat super funktioniert.

Ich hätte gleich noch eine Frage.

Wenn es nicht unverschämt ist...

Gibt es jetzt noch einen Möglichkeit?

Dass ich immer eine Nachricht bekomme, per Telegram einen Tag bevor ich die Mülltonne raus stellen muss?

Komme da gerade auch nicht wirklich weiter.

Hab es mit einer Rule versucht, dass immer um 17:30 Uhr die Termine abgeglichen werden und wenn ein Termin am nächsten Tag ist soll er mir eine Telegram Nachricht schicken...

Schon mal vielen lieben Dank im Voraus.

Gruß

Simon

Re: Müllkalender/ Terminerinnerung per Telegram

Verfasst: 5. Mai 2020 21:49
von 03chris
Hallo Simson,
natürlich geht es auch. Vielleicht ist das hier nicht die beste Variante, funktioniert aber zuverlässig.

Code: Alles auswählen

rule "Benachrichtigung für Müllabholung per Telegram"
when 
   Time cron "0 30 17 * * ?"
then 
    val telegramAction = getActions("telegram","telegram:telegramBot:bot")      
	if (now.isAfter(new DateTime((CalDav_Date.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli).minusDays(1)) && 
	    now.isBefore(new DateTime((CalDav_Date.state as DateTimeType).zonedDateTime.toInstant.toEpochMilli))) {
		  telegramAction.sendTelegram("Morgen wird %s  geleert", CalDav_Muell.state.toString.replace("ue", "ü"))
	}
end