Telegram als Messenger einbauen

Welche Geräte sollen noch implementiert werden?
Was sollte man ändern / verbessern / ergänzen an der Solaranzeige? Hier kann Jeder seine Ideen einbringen.
Außerdem steht hier, woran gerade gerbeitet wird.

Moderator: Ulrich

Forumsregeln
Wenn neue Geräte implementiert werden sollen ist die Protokollbeschreibung der Schnittstelle vom Hersteller Voraussetzung.

Bitte nur konkrete Ideen hier eintragen und in jedem Beitrag bitte nur eine Erweiterung / Änderung, damit das Ganze noch überschaubar bleibt. Ein ganzes Sammelsorium von Ideen in einem Thread ist zu unübersichtlich. Nicht alles kann und wird auch verwirklicht werden.
Antworten
gzi
Beiträge: 153
Registriert: Mo 16. Jan 2023, 20:43
Hat sich bedankt: 20 Mal
Danksagung erhalten: 29 Mal

Telegram als Messenger einbauen

Beitrag von gzi »

Hier ist meine Implementierung dazu. Wenns gefällt, bitte übernehmen!
Mit 700 Mio aktiven Usern ist Telegram eine sehr verbreitete App.
Diese Funktion ist dazu gedacht, dass man sie in der funktionen.inc.php vor po_send_message eingefügt.

Code: Alles auswählen

  function send_template_message( $Token, $Key, $Message, $Bild = 0, $DevName = "", $Messenger = "telegram") {
	$URL_Template = array();
	$URL_Template["telegram"] = "https://api.telegram.org/bot<UserToken>/sendmessage?chat_id=<channel_ID>&text=<Message>";
    //$this->log_schreiben( $Messenger." send_template_message.", "*  ", 5 );
		  
	// Versand nach Telegram Messenger
    if (isset( $URL_Template[strtolower($Messenger)])) {
	  $url = str_replace( "<UserToken>",$Token,$URL_Template[strtolower($Messenger)]);
	  $url = str_replace( "<channel_ID>",$Key,$url);
	  $url = str_replace( "<Message>",htmlspecialchars($Message,ENT_QUOTES),$url);
	  //$this->log_schreiben( $Messenger." send_template_message : ".$url, "*  ", 5 );
	  
	  if ($ch = curl_init( $url )) {
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 );
        $result = curl_exec( $ch );
        $rc_info = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
        if (curl_errno( $ch )) {
          $this->log_schreiben( "Curl Fehler! Daten nicht zu ".$Messenger." gesendet! Curl ErrNo. ".curl_errno( $ch ), "   ", 3 );
        } elseif ($rc_info["http_code"] == 200 or $rc_info["http_code"] == 204 or $rc_info["http_code"] == 203) {
          $this->log_schreiben( "Daten zum Messenger ".$Messenger." gesendet. ", "*  ", 3 );
        } elseif ($rc_info["http_code"] == 400) {
			$this->log_schreiben( $Messenger." bad Request: Channel-ID falsch. ", "*  ", 3 );
		} elseif ($rc_info["http_code"] == 401) {
			$this->log_schreiben( $Messenger." bad Request: Token falsch.", "*  ", 3 );
		} else {
			curl_close( $ch );
			$this->log_schreiben( $Messenger." sent ", "*  ", 8 );
			return true;			
		}
      } 
	  return false;
	} else {
		// use standard-Interface
		$result = $this->po_send_message( $Key, $Token, $Message, $Bild, $DevName, $Messenger );
		return $result;
	}
  }

Wie man am Ende sehen kann, ruft dieses Interface für andere Messenger die existierende Funktion po_send_message auf.

Um zu verhindern, dass die gleiche Message mehrmals hintereinander geschickt wird, habe ich auch noch folgende Funktion geschrieben. Diese ruft die obige Funktion auf, wenn die Message nicht schon in der gleichen Minute, Stunde, Tag, Monat ... an den Messenger geschickt wurde. Das wird über den letzten Parameter cache-period gesteuert.

Code: Alles auswählen

  function send_cached_message( $Token, $Key, $Message, $Bild = 0, $DevName = "", $Messenger = "pushover", $cache_period="YmdHi" ) {
    // prüfen, ob Message heute schon gesendet wurde und im cache steht
	//
	// $cache_period = false : die gleiche Message wird immer gesendet
	// $cache_period = "Ym" : die gleiche Message wird max einmal pro Monat.
	// $cache_period = "Ymd" : max einmal pro Tag .
	// $cache_period " "YmdH" : max einmal pro Stunde oder
	// $cache_period " "YmdHi" : max einmal pro Minute gesendet
	
	$message_cache_filename = "/var/www/html/database/message_cache.php";
		
	if (in_array($cache_period, array("Ym","Ymd","YmdH", "YmdHi"))) {
		$jetzt = date($cache_period);
		$message_cache = array();
		if (file_exists( $message_cache_filename )) {
			require($message_cache_filename); 
		}
		
		$messengerkey = strtolower($Messenger);
		$msgkey = htmlspecialchars($Message, ENT_QUOTES);
		$this->log_schreiben( "send: ".$msgkey." if not in ".print_r($message_cache,true), "   ", 9 );

		if (isset($message_cache[$messengerkey][$msgkey][$cache_period])) {
			$last_sent = $message_cache[$messengerkey][$msgkey][$cache_period];
			if ($last_sent == $jetzt) {
				// wurde schon gesendet
				$this->log_schreiben( "Msg not sent (in cache)", "   ", 8 );
				return true;
			}
		}
		if ($this->send_template_message( $Token, $Key, $Message, $Bild, $DevName, $Messenger )) {
			// Message erfolgreich gesendet
			$message_cache[$messengerkey][$msgkey][$cache_period] = $jetzt;
			
			$conf="<?php".PHP_EOL .
			"\$message_cache=array();".PHP_EOL;
			foreach ($message_cache as $mgrkey => $mgrvalue) {
				foreach ($mgrvalue as $meskey => $mesvalue) {
					foreach ($mesvalue as $pkey => $pvalue) {
						$conf = $conf."\$message_cache['".$mgrkey."']['".$meskey."']['".$pkey."']='".$pvalue."';".PHP_EOL;
					}
				}
			}
			$conf = $conf."?>";
			
			file_put_contents ( $message_cache_filename , $conf);
			return true;
		} else {
			return false;
		}
	} else {
		$this->log_schreiben( "send_cached_message: Cache_period ungültig : ".$cache_period, "   ", 5 );
	}
  }


In der user.config.php muss man folgende Parameter eintragen:

Code: Alles auswählen

$Messenger = true;
//
//  Welcher Messengerdienst soll benutzt werden?
$Messengerdienst[1] = "telegram";   //  Telegram, Pushover, Signal oder WhatsApp
$API_Token[1] = "<yourtoken>";
$User_Key[1] = "<yourChannelID>";
Token und ChannelID von Telegram besorgen

Voraussetzung ist natürlich, dass man einen (kostenlosen) Telegram-Account hat. Nachrichten können von der Solaranzeige mit folgendem URL an einen Telegram-Kanal/Channel gesendet werden. Alle Telegram-User, die den Kanal abonnieren (z.B. Familienmitglieder) erhalten dann diese Nachrichten aufs Handy.

Code: Alles auswählen

https://api.telegram.org/bot<access-token>/sendmessage?chat_id=<channelID>&text=<nachrichtentext>
Damit das funktioniert, braucht man also den <access-token> und die <channelID> . Die muss man in Telegram (kostenlos) anlegen.

Access Token und Messagebot erzeugen

Telegram-App öffnen und einen Chat mit dem Telegram Botfather Bot öffnen. Aufpassen dass man den offiziellen erwischt! Dort folgendes Kommando eingeben

Code: Alles auswählen

/newbot
Alright, a new bot. How are we going to call it? Please choose a name for your bot.

Code: Alles auswählen

SolaranzeigeParisBot
Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

Code: Alles auswählen

SolarParis_bot
Done! Congratulations on your new bot. You will find it at t.me/SolarParis_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands. By the way, when you've finished creating your cool bot, ping our Bot Support if you want a better username for it. Just make sure the bot is fully operational before you do this.

Use this token to access the HTTP API:

123456789ABCDEFGHIJ

Keep your token secure and store it safely, it can be used by anyone to control your bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Telegram Kanal erstellen und channelID ermitteln

Kanal erstellen und MessageBot hinzufügen

Telegram-App öffnen und rechts oben in der Chat-Übersicht auf den Button mit dem Stift klicken. Dann „Neuer Kanal“ auswählen. Dem Kanal einen Namen geben. Z.B.:

Code: Alles auswählen

Smarthome-Paris
Sichtbarkeit des Kanals auf: „öffentlich“ einstellen.
Einen Channel-Link Namen für den Channel-Link festlegen. z.B.:

Code: Alles auswählen

http:/t.me/[b]Smarthome_Paris[/b]
Dann auf „weiter“ klicken.

Im nächsten Schritt den zuvor erzeugten MessageBot „SolarParis_bot“ als Administrator zum Kanal hinzufügen. GGf. weitere Familienmitglieder zum Channel hinzufügen/einladen. Diese müssen natürlich einen Telegram-Account haben. Dann „weiter“ klicken.

ChannelID ermitteln

Im Web-Browser folgenden URL eingeben. Dabei als chat-ID ein @ gefolgt vom Namen im Channel-Link eingeben.

Code: Alles auswählen

https://api.telegram.org/bot<access-token>/sendmessage?chat_id=<channelLinkName>&text=<nachrichtentext>
Z.B. :

Code: Alles auswählen

https://api.telegram.org/bot123456789ABCDEFGHIJ/sendmessage?chat_id=@Smarthome_Paris&text=some-text-to-you 
Telegram antwortet mit

Code: Alles auswählen

Ok	True
result	
message_id	6
sender_chat	
Id	-100123456789
….	
Unter Id findet sich der ChannelID z.B. -100123456789 . (Beginnt immer mit minus 100)
Anschließend den Channel wieder auf „private“ umstellen.

Testweise Nachrichten an Telegram-Channel versenden

Nun kann man mit HTTP-Requests Messages an den Channel senden.
z.B.

Code: Alles auswählen

https://api.telegram.org/bot123456789ABCDEFGHIJ/sendmessage?chat_id=-100123456789&text=some-text-to-you2
Alle Telegram-User, die den Channel abonniert haben, können die dort eintreffenden Nachrichten in der Telegram-App am Handy und im Web-Browser lesen .
Raspi 3B, Hybrid Must PV18-3024 VHM, Hoymiles HM-800 , Nachteinspeisung, Flex-BKW, AhoyDTU, Smart Meter DTSU666-H, DIY Akku 6,7 KWh, DalyBMS2MQTT, Victron2MQTT,Architektur, HomeMatic CCU. Autor: Solaranlage Do-It-Yourself

Antworten

Zurück zu „Wunschliste und was wird gerade umgesetzt.“