TelegramBot ID's bekannt machen

Begonnen von dennis_n, 21 September 2019, 22:22:16

Vorheriges Thema - Nächstes Thema

dennis_n

Hi,

ich nutze bei uns in der Feuerwehr fhem und Telegram, damit die Kameraden Rückmeldung geben können ob Sie zu einem Einsatz kommen oder nicht.
Das ganze lief in einer Testphase mit ca. 10 Usern.

Jetzt soll das aber auf über 100 User ausgerollt werden. Das bedeutet, dass ich für alle 100 einmal deren Telegram ID benötige und dann entsprechend einem Dummy zuweise.
Gibt es eine elegante Lösung, wie man die Telegram ID's der Kameraden in fhem bekommt ohne dass jeder erst dem Bot eine Nachricht schicken muss? Denn cih muss die ID ja erst dem Bot bekannt machen oder?

Danke

Gruss
Dennis

viegener

Ich vermute, Du willst an die Nutzer auch Nachrichten verschicken?
Dann müssen diese ja einmal mit dem Bot Kontakt aufnehmen, sonst können sie auch keine Nachrichten vom Bot empfangen. Dies ist eine Einschränkung von Telegram nicht von der FHEM-Implementierung.

Wenn die Leute dann also auch eine Nachricht an den Bot senden stehen sie in den Kontakten - ohne diese Nachricht ist auch die ID, die für den Versand notwendig ist normalerweise nicht bekannt (ID ist ja nicht Telefonnummer) und eine Verwendung des Namens oder Alias würde ich nicht empfehlen (Namen sind nicht eindeutig)
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

dennis_n

Hi,

danke für Deine Antwort.
Also die Kollegen sollen Telegram nur als Zusatz zur normalen Alarmierung nutzen. Daher sende ich bei einem Alarm auch keine Nachricht an die Kameraden raus.

Wenn deren Melder geht, sollen sie einfach Telegram öffnen und auf den bestimmten Button drücken.
Wie gesagt, das ist alles fertig. Es geht mir jetzt nur noch darum möglichst unkompliziert an die ID's der Kameraden zu kommen.

Die einzige Möglichkeit die ich gefunden habe ist folgende:
- Ich lasse im FHEM bot das empfangen von Nachrichten von unbekannten Nummern zu
- Ich stelle Verbose auf 4
- Der Kamerad sucht in Telegram nach dem Bot und sendet diesem eine Nachricht mit seinem Namen
- Somit habe ich im Logfile den Namen mit der zugehörigen ID

Ich dachte vielleicht gibt es eine bessere Alternative, um die ID's dann direkt als Dummy anzulegen wenn sie reinkommen.

Gruss
Dennis

CBSnake

Hi,

schön das es das Projekt noch gibt :-)

Ich seh hier 3 Möglichkeiten:

1. Eine große Gruppe, in die DU alle packst die nachher alarmiert werden sollen, in die Gruppe Kannst du dann auch die Anleitungen stellen wie jeder sich einen Chat mit dem "Feuerwehrbot" aufmachen kann.

2. Du gibst jedem den Namen deines Bots, die können diesen dann suchen und anschreiben

3. du machst das während des üblichen Treffen etc im Gerätehaus kurz selbst am Handy des Kameraden


Dein Bot listet dir, je nach Einstellung natürlich alle ID´s auf, nur reagiert er halt nicht auf Fremde :-) die Ids siehst du im Reading Contacts.
Klar könnte man das jetzt zerlegen und daraus Aktionen generieren, du musst, oder solltest aber eh jeden einzelnen prüfen, freischalten und seine "Fähigkeiten" eintragen. Da wirst um das Händische nicht rumkommen.

Klar wäre es schön das bei 100 stück zu automatisieren, nur wie hoch ist der Wechsel danach? gehen jeden Monat 5 und kommen 5 neue?
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

dennis_n

Irgendwie habe ich gehofft, dass Du antwortest ;-)

Natürlich gibt es das Projekt noch. Es wird fliessig genutzt und funktioniert einwandfrei. Kann ja hier mal ein paar Bilder des fertigen Alarmmonitors einstellen.
Jetzt geht es halt darum das ganze aus dem 10-Man Betrieb in die Hauptwache zu bringen. Und da sind e dann gleich 100 Mann.

Ich denke ich werde jedem den Namen des Bot geben und sagen, dass er dem Bot eine Nachricht mit seinem Namen schicken soll.
Dann habe ich alle ID's und muss die händisch anlegen. Is dann halt so.

Wenn die 100 mal drin sind, ist ein Wechsel eher selten. Wir sind da eigentlich sehr konstant.

Gruss
Dennis

P.S. Bilder folgen demnächst

CBSnake

Du hattest doch, ich meine in nem Dummy schon die Verknüpfung von ID zu den einzelnen skills? AGT, MA usw?
Ich denke eine Routine, welche das contacts Reading aufsplittet sollte mit userreading gehen. Du müsstest dann nur noch freischalten und die skills eintragen
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

viegener

Zitat von: dennis_n am 25 September 2019, 13:04:31
Wenn deren Melder geht, sollen sie einfach Telegram öffnen und auf den bestimmten Button drücken.
Wie gesagt, das ist alles fertig. Es geht mir jetzt nur noch darum möglichst unkompliziert an die ID's der Kameraden zu kommen.


Was ist denn "der bestimmte Button"?
Wenn es ein Button (inline oder keyboard) im Telegram client ist, dann geht es nicht, ohne dass die Benutzer den Bot zuerst kontaktieren.

Die IDs musst Du nicht aus dem log holen, sondern am einfachsten aus dem Contacts reading (wie schon beschrieben) - das lässt sich auch entsprechend automatisch aufteilen.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

dennis_n

Hi,

wir haben jetzt alle Kameraden registriert und bis jetzt funktioniert alles bestens.
Jetzt wollen wir die Anzeige noch etwas aufboren. Dazu brauche ich nochmal eure Hilfe.

1. Ich möchte in einem Reading alle Kameraden sehen, die auf Status 6 stehen. Die Gesamtzahl ist natürlich dynamisch und wird mal größer oder kleiner. Wenn also in Telegram jemand auf Status 6 drückt muss sich die Anzeige entsprechend erhöhen. Wenn er wieder im Status 2 ist, wieder reduzieren.

2. Wenn ein Alarm ist und jemand auf "KOMME" gedrückt hat, will ich ebenfalls in einem Reading sehen, wieviele gedrückt haben, dass sie kommen.
In einer kleineren Version (Danke an CBSnake) hatte ich dazu folgendes verwendet:
setreading dummy Gesamt {(my $d = ReadingsVal("$device","msgPeerId","");ReadingsNum("id_".$d,"Active",0) + ReadingsNum("Funktion","Gesamt",0))},

Das funktioniert auch soweit. Allerdings ist es möglich, dass die gleiche Person immer wieder auf "Komme" klickt und somit den Counter immer um eins erhöhen kann. Wie verhindere ich das?

Danke

Gruss
Dennis

viegener

Leider ist aus dem vorstehenden nicht wirklich klar, was die einzelnen Devices sind und was diese für werte haben, kann ich nur allgemein helfen:

Um sicherzustellen, dass jeder nur einmal gezählt wird würde ich folgende Dinge machen
- Für jeden der KOMME anwählt muss ein Kennzeichen abgelegt werden - ich vermute es gibt ein Device pro Kontakt (id_<id> ?) also könnte man dort ein Reading "KOMME" auf 1 setzen
- Das Aufsummieren der Zahlen sollte nur dann passieren, wenn nicht schon eine eins in KOMME steht
- zum Rücksetzen des Zählers müssen auch alle KOMME readings in den Kontakten entfernt werden (oder auf 0 gesetzt)
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

dennis_n

Hi viegener,

vielen Dank für Deine Antwort.
Also du vermutest richtig.
Jede Person hat einen Dummy id_xxxxxxxx. Im Dummy habe ich verschiedene Readings definiert. U.a. ob der Kamerad Atemschutzträger oder Gruppenführer ist. Steht der Wert auf 1, hat er die Funktion in der Feuerwehr. Steht der Wert auf 0 hat er sie nicht.

Wenn jemand KOMME drückt würde ich es noch hinbekommen, dass ich das Reading bei ihm auf 1 setze. Was ich aber eher nicht hinbekomme ist die Abfrage, ob er bereits auf 1 steht.
Hier mal das komplette DOIF, welches ich für die Antwort der Kameraden verwende:

(["FWStatus:msgPeerId"] and ([?FWStatus:msgText] eq "Komme NICHT"))
(set id_[$DEVICE:msgPeerId] [$DEVICE:msgText],
define loeschen_[$DEVICE:msgPeerId] at +00:30:00 set id_[$DEVICE:msgPeerId] 0)

DOELSEIF

(["FWStatus:msgPeerId"] and ([?FWStatus:msgText] eq "Komme"))
(set id_[$DEVICE:msgPeerId] [$DEVICE:msgText],

setreading Funktion Gesamt {(my $d = ReadingsVal("$device","msgPeerId","");ReadingsNum("id_".$d,"Active",0) + ReadingsNum("Funktion","Gesamt",0))},
define loeschen_[$DEVICE:msgPeerId] at +00:30:00 set id_[$DEVICE:msgPeerId] 0,
define loeschen_Funktion_Gesamt at +00:30:08 setreading Funktion Gesamt 0)


Gruss
Dennis

dennis_n

Also ich ahbe es jetzt soweit hinbekommen, dass wenn jemand KOMME oder KOMME NICHT gedrückt hat, in dem entsprechenden Device ein Reading auf 1 gesetzt wird.
Nach 30 Minuten wird das Reading wieder auf 0 gesetzt.

Aber wie zähle ich denn jetzt alle diejenigen zusammen, die KOMME oder KOMME NICHT gedrückt haben und schreibe die Zahl in den Dummy Gesamtstaerke?

Gruss
Dennis

CBSnake

Hi,

wie wäre es mit:

Komme -> Reading wird 1
Komme nicht -> Reading bleibt 0

Reset nach 30 min oder so

Immer wenn ein Komme Event statt findet zählst du alle, auch die 0er Readings zusammen.

Grüße
Achim
FHEM auf Debian 10, HM-Wlan, JeeLink-Wlan, Wlanduino, ConBee, TP-Link Steckdose, GHoma Steckdosen, Shelly Steckdosen

dennis_n

Hallo Chim,

soweit bin ich ja schon.
Habe es genauso gemacht und nach 30 Minuten gibt es einen Reset.

Ich hänge aber am Zusammenzählen derjenigen, die alle auf Status 1 stehen.

Gruss
Dennis

dennis_n

#13
So sieht mein DOIF aktuell aus:

(["BotID:msgPeerId"] and ([?BotID:msgText] eq "Komme NICHT"))
(set id_[$DEVICE:msgPeerId] [$DEVICE:msgText], setreading id_[$DEVICE:msgPeerId] Status 1,
setreading Gesamtstaerke KommeNicht {(my $d = ReadingsVal("$device","msgPeerId","");ReadingsNum("id_".$d,"Status",1) + ReadingsNum("Gesamtstaerke","KommeNicht",0))},
define loeschen_[$DEVICE:msgPeerId] at +00:30:00 set id_[$DEVICE:msgPeerId] Status 2;; setreading id_[$DEVICE:msgPeerId] Status 0)

DOELSEIF

(["BotID:msgPeerId"] and ([?BotID:msgText] eq "Komme"))
(set id_[$DEVICE:msgPeerId] [$DEVICE:msgText], setreading id_[$DEVICE:msgPeerId] Status 1,
setreading Gesamtstaerke Komme {(my $d = ReadingsVal("$device","msgPeerId","");ReadingsNum("id_".$d,"Status",1) + ReadingsNum("Gesamtstaerke","Komme",0))},
define loeschen_[$DEVICE:msgPeerId] at +00:30:00 set id_[$DEVICE:msgPeerId] Status 2;; setreading id_[$DEVICE:msgPeerId] Status 0)


Also das funktioniert soweit. Was ich nicht hinbekomme, ist die Abfrage, ob die id_xyz schonmal gedrückt hat. Aktuell kann man immer wieder auf "Komme" drücken und das Reading wird fleißig hochgezählt. Das soll natürlich nicht sein.

Gruss
Dennis

viegener

@dennis_n: Nein der Vorschlag von CBSnake war eben bei "Komme nicht" den Wert auf 0 zu setzen und bei "komme" oder "komme nicht" immer alle ids NEU zusammen zuzählen.

Aber das ist wahrscheinlich genauso , wie zuerst zu überprüfen, ob der status bereits auf 1 steht (und dann eben nichts mehr zu tun).
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können