FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: curt am 17 September 2019, 02:17:33

Titel: TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 17 September 2019, 02:17:33
Hallo TelegramBot-Nutzer,

Ich möchte:
* Am Handy in Telegram eine kurze Zeile schreiben.
* TelegramBot antwortet auf dem Kanal.

Genauer beschrieben: Ich habe in FHEM den Status aller Fenster als Summe: Ist da eins offen oder alle zu? Ich bin in Timbuktu und sende mit meinem Handy via Telegram "Fenster" - und der Bot antwortet "zu" oder "auf". Aber wir müssen uns jetzt nicht am Beispiel aufhalten, die Frage geht allgemein auf alles, was ein Reading hat: Wie geht das? Geht das überhaupt?

Ich möchte nicht:
Ich weiß theoretisch, dass man in FHEM der TelegramBot-Device mitgeben kann, dass sie ganz allgemein alle Kommandos vom Bot entgegennehmen soll: https://wiki.fhem.de/wiki/TelegramBot#Kommandos_ausl.C3.B6sen
Aus Sicherheitserwägungen möchte ich das nicht.

Mein Lernstand:
1) Ich kann von FHEM aus Messages an den Bot senden. Die kommen fein auf meinem Handy an.
2) Ich weiß von der Theorie her, dass es die Möglichkeit gibt, vom Handy aus Kommandos bei FHEM auszulösen.
3) Ich weiß, dass ich die commandref für telegrambot nicht verstanden habe.

Hmmm.
Ist meine Idee umsetzbar? Hat das jemand von euch schon umgesetzt?
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 17 September 2019, 02:37:05
Zitat von: curt am 17 September 2019, 02:17:33
die Frage geht allgemein auf alles, was ein Reading hat: Wie geht das? Geht das überhaupt?

Das geht zB. mit msgDialog.
https://forum.fhem.de/index.php/topic,77297.msg758597.html#new (https://forum.fhem.de/index.php/topic,77297.msg758597.html#new)
https://wiki.fhem.de/wiki/MsgDialog (https://wiki.fhem.de/wiki/MsgDialog)

VG Sebastian
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 17 September 2019, 03:02:47
Danke für Deine schnelle Antwort.

Ich habe das ganz schnell überflogen und ... also ... so richtig schlau werde ich nicht.

Ich frage mal ganz keck:
Nutzt Du diesen Anwendungsfall? Magst Du mir das ganz konkret an einem Beispiel zeigen?

(Das wäre sehr schön, ich bin ein Typ, der am besten von Beispielen lernt.)
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 17 September 2019, 04:22:07
Zitat von: curt am 17 September 2019, 03:02:47
Danke für Deine schnelle Antwort.

Ich habe das ganz schnell überflogen und ... also ... so richtig schlau werde ich nicht.

Ich frage mal ganz keck:
Nutzt Du diesen Anwendungsfall? Magst Du mir das ganz konkret an einem Beispiel zeigen?

(Das wäre sehr schön, ich bin ein Typ, der am besten von Beispielen lernt.)

Ich nutze nicht genau diesen Anwendungsfall. Aber Licht ein-/ausschalten oder Steckdosen ein-/ausschalten
geht ja in die Richtung. Hier mal ein Dialog für die Lampen (DEF):
{
"02.💡...Lampen....💡": {
"message": [
"(💡 Lampe einschalten) ",
"(💡 Lampe ausschalten) ",
    "(abbrechen|zurück:%me%) ",
"Bitte wählen:"
],
"💡 Lampe einschalten": {
"message": [
"{return(lightsOn())}"
],
"Einschalten": {
"match": ".*_licht",
"commands": [
"set $message on",
"set $SELF say @$recipient 02.💡...Lampen....💡|Lampe einschalten"
]
},
"Zurück": {
"commands": [
"set $SELF say @$recipient 02.💡...Lampen....💡"
]
}
},
"💡 Lampe ausschalten": {
"message": [
"{return(lightsOut())}"
],
"Ausschalten": {
"match": ".*_licht",
"commands": [
"set $message off",
"set $SELF say @$recipient 02.💡...Lampen....💡|Lampe ausschalten"
]
},
"Zurück": {
"commands": [
"set $SELF say @$recipient 02.💡...Lampen....💡"
]
}
}

}
}


Und hier der dazugehörige Code in myUtils:
sub lightsOut
{
  my @lights = devspec2array('.*_licht:FILTER=STATE!=off');
  my $msg = '';
  if (@lights > 0 and defined($defs{$lights[0]})) {
    foreach (@lights) {
      $msg .= '('.AttrVal($_,'alexaName','alexaName').-AttrVal($_,'alexaRoom','alexaRoom').' :'.$_.') ';
}
$msg .= '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Folgende Lampen sind an:';
  }
  else {
    $msg = '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Alle Lampen sind aus.';
  }
  return $msg;
}

sub lightsOn
{
  my @lights = devspec2array('.*_licht:FILTER=STATE=off');
  my $msg;
  if (@lights > 0 and defined($defs{$lights[0]})) {
    foreach (@lights){
      $msg .= '('.AttrVal($_,'alexaName','alexaName').-AttrVal($_,'alexaRoom','alexaRoom').' :'.$_.') ';
    }
    $msg .= '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Folgende Lampen sind aus:';
  }
  else {
    $msg = '(🔄Aktualisieren) (Zurück) (⬆️Hauptmenü:Q) Alle Lampen sind an.';
  }
  return $msg;
}


Ich denke der Code ist auch ohne Kommentare lesbar. Entscheidend ist hier eigentlich nur
my @lights = devspec2array('.*_licht:FILTER=STATE!=off');

Damit kannst du zB. auch alle offenen Fenster abholen. Oder was auch immer offen/zu/an/aus ist  ;)

Ich nutze msgDialog für alles mögliche:
Wecker, Lampen, Steckdosen, Bewohner, Dienste, Staus, Blitzer,...

VG Sebastian
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 17 September 2019, 04:33:57
Das ganze sieht dann so aus:

VG Sebastian
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Wzut am 17 September 2019, 06:56:25
Man kann auch fürs Zigaretten holen einen 40 Tonner mit Anhänger benutzen ....
Gegeben sei ein Telebot mit Namen TeleBot und eingetragenem Attribut defaultPeer und ein Device mit Namen "offene_Fenster" das in einem Reading mit Namen "of_Fe" den Status der Fenster hat.
defmod TeleBot_notify_Test notify TeleBot:msgText:.Fenster { \
  fhem("set TeleBot message Status aller Fenster ".ReadingsVal("offene_Fenster","of_Fe","unbekannt"));;\
}

Aber Achtung : Anfragen kann in dem Beispiel jeder, die Antwort geht allerdings immer an defaultPeer und es gibt nur eine Antwort wenn man exakt "Fenster" schreibt.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 17 September 2019, 11:09:47
ZitatMan kann auch fürs Zigaretten holen einen 40 Tonner mit Anhänger benutzen ....
Ja kann man...

Dafür ist msgDialog eine extrem flexible, schicke und sichere Art mit seinem Smarthome zu reden.
Vom WAF mal ganz abgesehen...  ;)

VG Sebastian
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Wzut am 17 September 2019, 12:49:51
maybe, aber das war nicht curts Frage ..
Zitatdie Frage geht allgemein auf alles, was ein Reading hat: Wie geht das? Geht das überhaupt?

Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 17 September 2019, 13:01:03
Zitatmaybe, aber das war nicht curts Frage ..
Aber klar doch! Es ist EINE MÖGLICHE LÖSUNG unter vielen...
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: flummy1978 am 18 September 2019, 14:40:24
Hallo Sebastian,

Zitat von: binford6000 am 17 September 2019, 11:09:47
Ja kann man...

Dafür ist msgDialog eine extrem flexible, schicke und sichere Art mit seinem Smarthome zu reden.
Vom WAF mal ganz abgesehen...  ;)

Genauso sehe ich das auch. Denn ich habe genau nach sowas gesucht. Das "Rückgabemenu" das ich von Fhem bekomme, hätte ich gern wie Du anhand der Screenshots gezeigt hast und nicht wie es bei mir derzeit ist, als reines TextMenue.

Kannst Du dafür mal zeigen, wie Deine Senderoutine aussieht?

Der Hintergrund meiner Frage ist:
- Pur aus dem Telegram Device, bekomme ich den Befehl geschickt, so dass es als "Button" auftaucht  ABER:

- Der Button taucht in der Tastatureingabezeile auf (nicht wie bei Dir in den "empfangenen Nachrichten" oben)
- Aus der 99_myUtils heraus, bekomme ich ein mehrreihiges Menu gar nicht erst gesandt ;(

Vielen Dank im Voraus
Andreas

# Edith sagt: https://wiki.fhem.de/wiki/MsgDialog den hab ich ursprünglich übersehen. Aber ist das denn zwingend dafür nötig? Ich meine, man muss doch dem Telegram Bot auch so irgendwie näherbringen können, dass er Buttons aus den Nachrichten machen soll ( wie in Einzelnachrichten durch die () geschehen .... )
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 18 September 2019, 15:32:41
Zitat von: flummy1978 am 18 September 2019, 14:40:24
# Edith sagt: https://wiki.fhem.de/wiki/MsgDialog den hab ich ursprünglich übersehen. Aber ist das denn zwingend dafür nötig? Ich meine, man muss doch dem Telegram Bot auch so irgendwie näherbringen können, dass er Buttons aus den Nachrichten machen soll ( wie in Einzelnachrichten durch die () geschehen .... )

Nichts anderes macht ja auch msgDialog (set Befehle TelegramBot):
queryInline [ @<peer1> ... @<peerN> ] (<keyrow1>) ... (<keyrowN>) <text>
Sends the given message to the recipient(s) with an inline keyboard allowing direct response
IMPORTANT: The response coming from the keyboard will be provided in readings and a corresponding answer command with the query id is required, sicne the client is frozen otherwise waiting for the response from the bot! REMARK: inline queries are only accepted from contacts/peers that are authorized (i.e. as for executing commands, see cmdKeyword and cmdRestrictedPeer !)

queryEditInline <msgid> [ @<peer> ] (<keyrow1>) ... (<keyrowN>) <text>
Updates the original message specified with msgId with the given message to the recipient(s) with an inline keyboard allowing direct response
With this method interactive inline dialogs are possible, since the edit of message or inline keyboard can be done multiple times.

queryAnswer <queryid> [ <text> ]
Sends the response to the inline query button press. The message is optional, the query id can be collected from the reading "callbackID". This call is mandatory on reception of an inline query from the inline command above


Mit msgDialog bekommst du halt auch Menüs und Untermenüs hin  ;)
Dafür ist msgDialog leider nicht so trivial.  :o

VG Sebastian
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: flummy1978 am 18 September 2019, 15:58:41
Zitat von: binford6000 am 18 September 2019, 15:32:41
Nichts anderes macht ja auch msgDialog (set Befehle TelegramBot):

Mit msgDialog bekommst du halt auch Menüs und Untermenüs hin  ;)
Dafür ist msgDialog leider nicht so trivial.  :o

Genau hier scheint ja doch etwas anders zu sein....

Wenn man mit "set BOT-device @Empfänger (Button1) (Button1) text" etwas abschickt, kommt bei Telegram eben Buttons (1+2) anstelle der Tastatur und der text als Text oben in der Empfängerzeile. Bei Deinen Screenshots meine ich zu sehen dass alles an Button / text usw.  oben in der Empfängerspalte geschieht. So dass Du die eigentliche Tastatur bei Deinem Bot nicht mehr brauchst.

Das mit den Untermenues kann man dann ggf manuell machen. Ich würde ungern wieder ein seperates Modul aktivieren für etwas das generell alles unübersichtlicher macht, nicht nötig ist, wenn ich NUR die Syntax brauche, damit das oben im Menue angezeigt wird..... Mit ( ) wird ja schon mal ein Button angezeigt ;)

Grüße
Andreas
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: flummy1978 am 20 September 2019, 02:27:35
Hallo Curt,

zunächst einmal sorry, dass ich Deinen Beitrag für meine Frage genutzt habe, aber das Beispiel das binford6000 gebracht hat, hat mich einfach sehr interessiert.

Zitat von: curt am 17 September 2019, 02:17:33
Genauer beschrieben: Ich habe in FHEM den Status aller Fenster als Summe: Ist da eins offen oder alle zu? Ich bin in Timbuktu und sende mit meinem Handy via Telegram "Fenster" - und der Bot antwortet "zu" oder "auf". Aber wir müssen uns jetzt nicht am Beispiel aufhalten, die Frage geht allgemein auf alles, was ein Reading hat: Wie geht das? Geht das überhaupt?

Jupp das geht wunderbar sogar und ist eigentlich auch mit dem o.g. Beispiel gut umsetzbar.... Die Frage ist wie sehen die Nachrichten aus, die Du Dir auf das Handy geschickt hast ? Hast Du schon mal eine gewisse dynamische Benachrichtigung hinbekommen ? -> Wenn das passiert, dann sende das, sonst sende das oder mach mal dies..... ?

Ich frage deshalb, weil ich Deinen sonstigen FHEM (Perl) Kenntnissstand nicht weiß und sich somit vielleicht mehr Fragen als Antworten auftun, wenn ich Dir mein Beispiel zeige. Aber ich schieß da trotzdem einfach mal rein, wenn was unverständlich ist - Nur zu -

( Für alle anderen, die sicher mehr Erfahrung haben und es bestimmt schon mal (besser) gemacht haben -> Auch ich bin danbar für jeden noch so kleinen Tipp, denn nur so kann man lernen ;) )

Zunächst die Struktur:
Mich interessieren geschlossene Fenster und Türen nicht, sondern nur die offenen. Daher ist die Abfrage nur für nicht geschlossene Kontakte. Alle Geräte die bei mir einen Fenster oder Türstatus durchgeben können heißen TK.....irgendwas, damit lässt sich auch das folgende list erklären. Mit solchen Versuchen innerhalb FHEM teste ich erstmal, ob ich die Filter / Einschränkungen etc richtig hab, bevor ich an Perl unterroutinen und Notifys gehe ...

list TK_.*:FILTER=contact=false:FILTER=state=open alias

Damit werden nur Geräte gefunden die TK.....irgendwas heißen das Reading contact mit dem Zustand false haben und das reading state den Zustand open  hat. Zusätzlich wird das Alias des Gerätes angezeigt nicht nur der Devicename. (Dass contact und state abgefragt wird, liegt bei mir daran, dass ich in einigen Kontakten eine Zeitverzögerung eingebaut habe, die dann eben auch mal den Zustand "delayed" haben könnten)

Nun sende ich den Abfrage Befehl an Fhem(Telegram) und fange diesen mit dem notify ab:
/fenstertuer


telegramdevice:msgText:.* {
my $msgText = ReadingsVal("telegramdevice","msgText","");
my $msgPeerId = ReadingsVal("telegramdevice","msgPeerId","");
if(($msgPeerId eq "111222333") || ($msgPeerId eq "444555666")){ chatbot($msgPeerId,$msgText); }
}
}

Erklräung:
1112222333 und 44445555666 sind die IDs die meinem Telegrambot was schicken dürfen. Man sollte zwar noch mehr Sperren einbauen, wer die Befehle ausführen darf, aber das ist schon mal eine erste und imho zwingend notwendige Sache.
if $msgPeerId prüft diese
$msgPeerId = ReadingsVal("telegramdevice","msgPeerId","") - übernimmnt den Inhalt der Nachricht und übergibt diese über die Variable in das Unterprogramm.

chatbot($msgPeerId,$msgText);  Damit rufe ich die sub routine auf, die sich in 99_myUtils.pm (oder ähnlichem) befinden muss:

sub chatbot($$){
1 my ($msgPeerId, $msgText) = @_;
2 $msgText = lc $msgText;
3
4 if($msgText eq "/fenstertuer"){
5 # Suche nach Geräten mit contact reading und zustand "open"
6
7 my $temp = fhem "list TK.*:FILTER=contact=false:FILTER=state=open alias";
8 my $txt = " ist offen.";
9 $temp =~ s/(\S+\s)(.*)(\n)/$2$txt\n/mg;
10 fhem "set telegramdevice message \@$msgPeerId $temp";
11 }
12
13 }


Zeilennummern musst Du entfernen:
1. Übernahme der Variablen aus dem o.g. Notify
2. umschreiben der Nachricht auf kleinbuchstaben (falls Autokorrektur schon mal dazwischen greift)
4. Abfrage ob Nachricht /fenstertuer beinhaltet
7. das oben erwähnte List in eine Variable schieben (mit dem Schönheitszusatz, dass der Alias Name genommen wird und nicht der Device Name)
8. Schönheitstext hinter dem Gerätealias - "ist offen"
9. Schneidet aus der Variablen den Gerätenamen ab und hinterlässt nur noch den Text "Alias ist offen" ... Also z.B "Fenster Schlafzimmer ist offen"
10 sendet das Telegram mit dem Inhalt an die ID die oben mit übernommen wurde


Wenn Du sonst noch nie was mit Perl gemacht hast, wird es schwierig sowas umzusetzen. Aber soweit es in meiner Macht steht, habe ich versucht nach bestem Wissen  und Gewissen hiermit zu helfen und jeder hat mal angefangen.  Wenn Du noch Fragen hast... nur zu :)  ::)


@binford6000:

Ich habs komplett ohne msgDialog hinbekommen. QueryInline ist hier das Zauberwort. Aber nun kann ich mich vom Hauptmenu durch diverseste Untermenus schlengeln, wenn ich das möchte und alles ohne eine einzige Antwort per Text zu schreiben oder die Buttons auf der Tastatur zu haben.
Danke für den Hinweis in die richtige Richtung  8)

Viele Grüße
Andreas
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 20 September 2019, 03:13:10
Zitat von: flummy1978 am 20 September 2019, 02:27:35
Hallo Curt,
zunächst einmal sorry, dass ich Deinen Beitrag für meine Frage genutzt habe, aber das Beispiel das binford6000 gebracht hat, hat mich einfach sehr interessiert.

Absolut kein Problem.

Ich habe im Moment den Vorschlag von @Wzut im Auge, aber noch nicht umgesetzt. Andererseits wäre es natürlich schön, wenn es in der Handy-Telegram-App ein Knöpfchen "Fenster" gäbe und ich nicht erst "Fenster" eintippen muss. Klar.

Zitat von: flummy1978 am 20 September 2019, 02:27:35
Jupp das geht wunderbar sogar und ist eigentlich auch mit dem o.g. Beispiel gut umsetzbar.... Die Frage ist wie sehen die Nachrichten aus, die Du Dir auf das Handy geschickt hast ? Hast Du schon mal eine gewisse dynamische Benachrichtigung hinbekommen ? -> Wenn das passiert, dann sende das, sonst sende das oder mach mal dies..... ?

Mit wem redest Du gerade?

Falls ich gemeint bin: Nur einfachste Dinge via msg, Haustüre auf, Rasenmäher bockt, es regnet.

Zitat von: flummy1978 am 20 September 2019, 02:27:35
Ich frage deshalb, weil ich Deinen sonstigen FHEM (Perl) Kenntnissstand nicht weiß und sich somit vielleicht mehr Fragen als Antworten auftun, wenn ich Dir mein Beispiel zeige. Aber ich schieß da trotzdem einfach mal rein, wenn was unverständlich ist - Nur zu -

Falls ich gemeint bin:
Perl ist Hausgebrauch. Beispiele erstmal nicht angesehen - danke trotzdem.

Zitat von: flummy1978 am 20 September 2019, 02:27:35
Zunächst die Struktur:
Mich interessieren geschlossene Fenster und Türen nicht, sondern nur die offenen.

Das ist hier anders gelöst:
Alle Türen und Fenster sind in einer structure zusammengefasst. Und die ist halt open oder closed (wenn nur eins offen ist, ist in der structure alles offen) - habe ich mir mal irgendwann aus dem Forum geklaut. So sieht das hier aus:


define structure_Fenster structure Fenster_Status <Auflistung aller Devices>
attr structure_Fenster alias Fenster: Status
attr structure_Fenster clientstate_behavior relative
attr structure_Fenster clientstate_priority open closed
attr structure_Fenster devStateIcon open:fts_window_1w_tilt@red closed:fts_window_1w@green


Ich kann gern das list nachliefern, müsste dann aber aufwändig die Namen der Devices rauslöschen. Das Ergebnis der Veranstaltung steht jedenfalls in "state".

Den weiteren Teil übergehe ich im Moment, wir müssen erstmal gleiche Sprache finden - denke ich.

BTW: Danke für eure Mühe!
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: flummy1978 am 20 September 2019, 13:32:37
Hallo Nachteule, Curt,

Mit wem ich rede.... lach....  War komplett alles für Dich. Komplette Anleitung / Erklärung wie ich es gemacht habe, war ausschließlich für Deine Fragestellung gedacht :)

Erst beim letzten Abschnitt  @binford6000.... Ist der angesprochene ein anderer ;)

Grüße
Andreas
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: binford6000 am 20 September 2019, 17:35:35
Zitat@binford6000:
Ich habs komplett ohne msgDialog hinbekommen. QueryInline ist hier das Zauberwort. Aber nun kann ich mich vom Hauptmenu durch diverseste Untermenus schlengeln, wenn ich das möchte und alles ohne eine einzige Antwort per Text zu schreiben oder die Buttons auf der Tastatur zu haben.
Danke für den Hinweis in die richtige Richtung  8)
Viele Grüße
Andreas

Gerne  8)
Das werde ich mir auch mal in Ruhe anschauen. Wobei ich mit den Dialogen auch gut zurechtkomme.
VG Sebastian
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Meck am 23 September 2019, 11:57:56
Mal schauen wie wir das für das Wiki nutzen können denke es ist ein gutes Beispiel.
https://forum.fhem.de/index.php/topic,101975.0.html
Vielleicht können wir hier zusammen ein allgemein gültiges Beispiel noch draus machen. Dann ist es gut festgehalten für die nach Welt.


Aktuell grüble ich noch über die allgemeine Grundstruktur und das ist schon im Detail. Daher merke ich mir das mal.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: flummy1978 am 23 September 2019, 17:20:41
Zitat von: Meck am 23 September 2019, 11:57:56
Mal schauen wie wir das für das Wiki nutzen können denke es ist ein gutes Beispiel.

Ich denke mal, damit sind die Beispiele / Screenshots von binford6000 (Sebastian) gemeint oder ?
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 04 April 2021, 06:14:44
Darf ich mal wieder was ganz Dummes fragen?

Also ich habe für "geht das noch"

define teleBot_notify_Test notify teleBot:msgText:.Test { fhem("set teleBot message funktioniert ")}


und für das berühmte Batterieproblem

define at_Batteriewarnung at *09:05 {\
  my @devs = devspec2array("battery=low,batteryPercent<10");;\
  fhem "set teleBot message Batterie: ".join(", ",@devs) if (@devs);;\
}


Naiv wie ich bin dachte ich mir, dass ich mir doch ganz einfach auch sämtliche irgendwo vorhandenen Temperaturen abrufen könnte; ich kombiniere beides mal. Dann gebe ich am Handy Temp ein und es geht los:


define teleBot_notify_temperatur teleBot:msgText:.Temp { \
  my @devs = devspec2array("temperature<100");;\
  fhem "set teleBot message Temp: ".join(", ",@devs) if (@devs);;\
}


Hmmm, schön wäre es gewesen. Bei fhem-Start meint FHEM: FHEM:configfile: Unknown module teleBot:msgText:.Temp

Was mache ich denn da nun wieder falsch?
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 04 April 2021, 06:37:19
a) direktes cfg-Editieren;
b) notify in der DEF unterschlagen...
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 04 April 2021, 07:06:20
Zitat von: Beta-User am 04 April 2021, 06:37:19
a) direktes cfg-Editieren;

Es ist Ostern: Nur die Harten komm in Garten ...

Zitat von: Beta-User am 04 April 2021, 06:37:19
b) notify in der DEF unterschlagen...

Yepp ... blond, blauäugig und blind ... danke!

Aber so richtig funktioniert es trotzdem nicht - und ich habe den Profi grad so schön an der Strippe: Jetzt habe ich eine schöne Liste aller Devices, die ein Readin temperature haben. Auch schon nicht schlecht - aber ansich hätte ich ja gern Begriffspaare: Also "Devicename 18" oder so etwa.

Wie mache ich das denn vor Schreck?
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 04 April 2021, 07:15:42
HM, das ist nicht ganz so einfach, zumal ich nicht sicher bin, ob dein code in der jetzigen Form immer die erwarteten Ergebnisse liefert (Fall: kein Match und (anderes Problem) devspec mit "kleiner").
Wird eher ein Mehrteiler, Startpunkt für die weiteren Schritte könnte "list battery=low battery" sein.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 04 April 2021, 07:28:19
Ich glaube, dass wir gerade aneinander vorbei reden: Ich will ja den Wert des Readings "temperature".

Dieses DEVS-Konstrukt hat den Wert ja offensichtlich, sonst könnte es nicht gegen "100" (von mir willkürlich eingesetzt, damit im derzeitigen Konstrukt überhaupt was steht) testen.

Sicherheitshalber zeige ich -auch für andere schnelle Leser- das aktuelle Konstrukt nochmal:

define teleBot_notify_temperatur notify teleBot:msgText:.Temp { \
  my @devs = devspec2array("temperature<100");;\
  fhem "set teleBot message Temp: ".join(", ",@devs) if (@devs);;\
}


Da wirft er mir nur eine Liste der Devices aus, ich hätte aber logischerweise lieber

Küche 17
Wohnzimmer 21
Kammer 15


Da weiß der blonde, blauäugie Jüngling schon älteren Semesters leider nicht, wo man die Brechstange ansetzt ... ich wette, das sind nur 5 oder 6 chars - die da fehlen ...

P.S: Das war zu implizit geschrieben. Ok, präziser: Ich finde keine Beschreibung der Möglichkeiten (und Unmöglichkeiten) von devspec2array, da fehlt offensichtlich ein Wiki-Artikel.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 04 April 2021, 08:24:09
devspec2array sollte in der DevelopmentIntro enthalten sein und liefert einfach eine Liste mit Namen, oder eben die devspec zurück...

Das muss man weiterverarbeiten, daher der Hinweis auf "list":
define teleBot_notify_temperatur notify teleBot:msgText:.Temp { \
  my @devs = devspec2array('temperature<100');;\
  return if @devs == 1 && $devs[0] eq 'temperature<100';;\
  my $toList = join q{,}, @devs;;\
  my $list = fhem("list $toList temperature");;\
  fhem "set teleBot message Temp: $list";;\
}

Wenn die Zeitstempel stören, musst du eine for-loop über die Liste (das array) laufen lassen und dann eben ReadingsVal abfragen und selber formatieren.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: TomLee am 04 April 2021, 13:52:42
ZitatWenn die Zeitstempel stören, musst du eine for-loop über die Liste (das array) laufen lassen und dann eben ReadingsVal abfragen und selber formatieren.

So in der Art oder ginge es auch weniger umständlich

{
my @devs = devspec2array('temperature<100');;
return if @devs == 1 && $devs[0] eq 'temperature<100';;
my @a;;
for (@devs){my $list = $_;;
$list .= " ".ReadingsNum($_,'temperature','0')." °C\n";;
push @a,$list;;}
my $a2s = join q{,}, @a;;
$a2s =~ s/,//g;;
fhem("set tb_TelegramBot message Temp: $a2s");;}


Frohe Ostern
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 04 April 2021, 22:19:18
Oh, das funktioniert super: Danke @TomLee. Und danke @Beta_User.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 05 April 2021, 01:56:43
Gleich noch eine Frage: Würde das auch irgendwie mit structure gehen?

Hintergrund:
Ich habe eine structure_Fenster. Da sehe ich schön, dass bei "open" ein oder mehrere Fenster geöffnet sind. Das ist schon mal schön, das kann ich auch gut via telegramBot abrufen.

Nun wäre natürlich schön, wenn ich mit einem anderen telegram-Kommando aufrufen könnte, welche Fenster denn offen sind. (Der oben beschriebene Weg geht leider nicht. Ich habe inzwischen zwar verstanden, wie man das um Filter erweitert. Aber ich habe für die Fenstermelder kein sinnvolles Filterkriterium.)
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 05 April 2021, 06:48:20
Grundsätzlich sollte sich jedes beliebige Device abfragen lassen.

Tipp: Um Dialoge aufzubauen, ist "msgDialog" (braucht msgConfig) zu empfehlen.Ist - soweit ich mich entsinne - nicht so topp beschrieben, und ich habe mir leider auch nicht notiert, wo die relevanten Infos stehen... Mir ist nur in Erinnerung geblieben, dass es dafür wichtig ist, utf8Specials auf 1 zu setzen. Jedenfalls lassen sich damit sowas wie Menüstrukturen aufbauen.

Und was das Filterkriterium für Fenster angeht, kann man devspec (auch für devspec2array) auch mit einen Komma verknüpfen und Negativauswahlen definieren. Beispiel:
list TYPE=notify:FILTER=NOTIFYDEV!~.+,TYPE=TelegramBot:FILTER=utf8Special!~1
Sollte auch mit Fensterkontakten verschiedener Provenienz klappen ;) .

Und wenn man den Code etwas strukturiert, ist es auch kein Problem, je nach TYPE unterschiedliche Readings auszuwerten bzw. anders zu formatieren usw. (wenn das in diesem Fall überhaupt sinnvoll ist).

Zu TomLee's Code noch:
- Einrückungen sind hilfreich, um direkt zu sehen, auf welcher Ebene man ist.
- erst ein join mit Komma, um das dann wieder rauszuregexen, finde ich komisch; nimmt man gleich "join q{}, ...", kann man sich diesen Umweg sparen.
- Wenn schon Code aus der DEF, dann nur mit einem ";"

Generell gehört sowas für mich eher nach myUtils. V.a. bei der reinen "devspec2commaSeparatedList" kann man dann z.B. eine beliebige devspec übergeben, fertig die Laube...
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 05 April 2021, 07:08:41
Gut das ich Dich Lehr- und Zuchtmeister (positiv gemeint) an der Strippe habe:

Zitat von: Beta-User am 05 April 2021, 06:48:20
Grundsätzlich sollte sich jedes beliebige Device abfragen lassen.

Falls es eine Doku gibt. Entgegen Deines kyptischen Hinweises finde ich zu devspec2array keine solche - lediglich Wehklagen im Forum, dass es keine Doku dazu gibt. Das führt dann dazu, dass ich mit meinen Perl-Küchenkenntnissen inkl. "das ist nur so halb Perl" mit trial&error vor mich hinstümpere.

Zitat von: Beta-User am 05 April 2021, 06:48:20
Tipp: Um Dialoge aufzubauen, ist "msgDialog" (braucht msgConfig) zu empfehlen.

Ja, das steht (vmtl. ausgezeichnet beschrieben) in genau diesem Thread hier. Aber das ist aktuelle nicht meine Baustelle, ich will erstmal einfach nur "Fenster" eintippen und telegram rotzt mir zurück. Finde ich für mich im Moment schön.

Zitat von: Beta-User am 05 April 2021, 06:48:20
Und was das Filterkriterium für Fenster angeht, kann man devspec (auch für devspec2array) auch mit einen Komma verknüpfen und Negativauswahlen definieren. Beispiel:

Das Beispiel habe ich nicht verstanden. Ok, so halb. Warte ...

Zitat von: Beta-User am 05 April 2021, 06:48:20
Zu TomLee's Code noch:

Dessen Code finde ich toll. Durchaus auch, weil ich ihn so einigermaßen verstehe ... leider scheitert es wie immer an den Schnittstellen zu FHEM.

Ich scheitere da bei meinen Fenstern (für die ich structure in Erwägung zog) - das könnte auch mit @TomLee 's Code gehen:
Bei jedem Fenster habe ich ein Reading "FensterStatus" , das ist open oder closed. Ich nehme also Toms Code und passe ihn an:


# Das geht leider nicht.
define teleBot_notify_Fenster_2 notify teleBot:msgText:.Fenster { \
my @devs = devspec2array("FILTER=FensterStatus eq 'open'");;\
return if @devs == 1;;\
my @a;;\
for (@devs){my $list = $_;;\
$list .= " ".ReadingsNum($_,'FensterStatus','0')." °C\n";;\
push @a,$list;;}\
my $a2s = join q{,}, @a;;\
$a2s =~ s/,//g;;\
fhem("set teleBot message $a2s");;}


Die °C sollen uns nicht stören, das ist ein proof of concept. Der Code funktioniert nicht. Mangels Doku zu devspec2array weiß ich nicht, ob ich mir da überhaupt Readings greifen darf. Ich weiß auch nicht, wie man Strings dort testet ... = und == und eq scheitern jedenfalls.

Zu 80% ist es einfach meine Unerfahrenheit und Dummheit. Aber da gibt es ja Lichtblicke: Ich habe Dich und den Tom mit seinem von mir fast völlig verstandenem Code ...

Was mache ich da falsch, Beta-User?
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 05 April 2021, 07:23:52
Es gibt eine Doku: https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array (https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array)

Grundsätzlich funktioniert das via devspec (https://fhem.de/commandref_modular_DE.html#devspec (https://fhem.de/commandref_modular_DE.html#devspec)), dass dieser Zahlenvergleich klappt, hat mich ja bekanntermaßen überrascht, das scheint also ein undokumentiertes feature zu sein.

Aber grundsätzlich bekommst du via "list" alles angezeigt, was du als devspec vorgibst. Mein Beispiel liefert:
TelegramBot-Devices, die das nämliche Attribut nicht auf 1 gesetzt haben, und alle notify, die kein NOTIFYDEV gesetzt haben - ein Internal, das anzeigt, ob ggf. die regex verbesserungsfähig ist. Verlinke ich bei Interesse, es ging nur darum, was zu zeigen, was tendenziell auch in deiner Installation klappen sollte...

devspec mag keine Leerzeichen, da liegt in Teilen dein Problem. Versuch's mal mit:
list FensterStatus=open

Generell würde ich empfehlen, mit dem "list"-Kommando und devspec rumzuspielen, das ist essentiell, wenn man sowas machen will!
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 05 April 2021, 07:46:12
Zitat von: Beta-User am 05 April 2021, 07:23:52
list FensterStatus=open

Was man so alles machen kann - ich listete bislang nur eine einzelne Device.

Dein Vorschlag funktioniert nicht: Da werden mir alle Devices gelistet, die als Attribut "FensterStatus" haben.

Ok, ein Misserfolg ist ein Erfolg - zumindest erkennt er schon mal das Attribut ansich - nur der Test funktioniert nicht. Leider scheitern auch Ideen wie == oder eq oder die Apostrophierung des Ergebnisses wie "open" statt einfach nur open.

Hmmmm.
Zuchtmeister, hab mal bitte eine Idee - gestern flutsche es doch so schön.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 05 April 2021, 09:29:01
Glaskugel sagt: zu wenig input...
(Was wird denn geliefert, und was steht in FensterStatus).

Daher - wegen des Hinweises, dass Attribute gelistet werden - mal ein Auszug aus der bereits verlinkten Doku von devspec
ZitatUm die Suche einzugrenzen, kann man als Praefix i: für internal Werte, r: für Reading-Namen und a: für Attribute verwenden

Aber das hier liefert mir jedenfalls eine nachvollziehbare Liste:
list r:state=^closed$

Die Syntax ist auf alle Fälle näher an regex (^= "beginnt hier", $= "endet hier") als an irgendwas anderem, von daher sind eq und == definitiv nicht der richtige Ansatz.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 05 April 2021, 10:45:28
Zitat von: Beta-User am 05 April 2021, 09:29:01
Glaskugel sagt: zu wenig input...

Was willst Du denn noch mehr? Mehr als gesagt kommt von FHEM auch dann nicht, wenn Du mich prügelst.

Zitat von: Beta-User am 05 April 2021, 09:29:01
(Was wird denn geliefert, und was steht in FensterStatus).

"open" oder "close" - aber das weißt Du doch. Habe ich doch schon gesagt.

Zitat von: Beta-User am 05 April 2021, 09:29:01
Aber das hier liefert mir jedenfalls eine nachvollziehbare Liste:
list r:state=^closed$

Hmmm. Spannend, siehe unten!

Zitat von: Beta-User am 05 April 2021, 09:29:01
Die Syntax ist auf alle Fälle näher an regex (^= "beginnt hier", $= "endet hier") als an irgendwas anderem, von daher sind eq und == definitiv nicht der richtige Ansatz.

Wenn es (eq et al) das Richtige gewesen wäre, würden wir hier doch gar nicht reden - ich würde mich bedanken und gut. Oder es selbst durchgezogen haben und wegen "ohne Hilfe" mich nichtmal bedanken: Wenn ich es selbst kann, frage ich doch nicht.

Aber warte mal, da war ein wirklich interessanter Hinweis von Dir - ich baue den mal um:

list r:state=^open$


liefert wirklich alle offenen Fenster [und nur die!] (plus das structure-Element - darum kümmern wir uns später).

Ok, ich habe jetzt ein LIST, was das Richtige tut. Sehr schön.

Aber wie baut man diese Erkenntnis nun in das kurze wunderschöne von @TomLee ? Hilf einem alten Mann mal bitte auf Pferd.

P.S: Mir fällt grad auf, dass man es Helfern einfach machen solle, wenn man Hilfe erbittet - die nicht fukntionierende Vorlage ist diese, da gehört Dein/unser Erkenntnisprozess rein. Muss ich echt erst zugeben, dass ich das nicht kann?

# Das geht leider nicht.
define teleBot_notify_Fenster_2 notify teleBot:msgText:.Fenster { \
my @devs = devspec2array("FILTER=FensterStatus eq 'open'");;\
return if @devs == 1;;\
my @a;;\
for (@devs){my $list = $_;;\
$list .= " ".ReadingsNum($_,'FensterStatus','0')." °C\n";;\
push @a,$list;;}\
my $a2s = join q{,}, @a;;\
$a2s =~ s/,//g;;\
fhem("set teleBot message $a2s");;}
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 05 April 2021, 12:24:15
Na ja, eigentlich wollte ich den output des list sehen. Macht aber nichts, wenn es denn jetzt (fast) klappt...

Vielleicht nochmal der scheinbar "missing link": Beide Kommandos (devspec2array und list) verwenden (fast) dieselbe Logik für <devspec>, bekommt man also was sinnvolles via list angezeigt, kann man das 1:1 in devspec2array übernehmen, fertig die Laube.

Wie bereits hier angedeutet, kann man auch (Negativ-) FILTER einbauen
list TYPE!~structure:FILTER=state=^open|tilted$

Bastelt man die Bausteinchen dann wieder zusammen, kommt z.B. (ungetestet) sowas raus:
define teleBot_notify_temperatur notify teleBot:msgText:.Fenster { \
  my @devs = devspec2array('TYPE!~structure:FILTER=state=^open|tilted$');;\
  my $text = @devs == 1 && $devs[0] eq 'TYPE!~structure:FILTER=state=^open|tilted$' ? \
  "Keine offenen Fenster!" :\
  join q{, }, @devs;;\
  fhem "set teleBot message Fenster: $text";;\
}


EDIT: Anführungszeichen ergänzt
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 06 April 2021, 14:34:30
Aha - verstanden.

Dein Vorschlag funktioniert wundervoll - ich danke Dir!

Hinweis, falls das jemand cut+paste übernehmen will: In Zeile 3 fehlt das beendende einfache Anführungszeichen, das gehört (wie in Zeile 2) direkt hinter tilted$ .
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 06 April 2021, 14:47:26
Danke auch für die Rückmeldung, den Typo habe ich korrigiert.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: TomLee am 06 April 2021, 15:12:18
Dann der Vollständigkeit wegen hier nochmal der korrigierte andere Vorschlag wie ich es verstanden habe, weil ich die Vermutung habe curt hat es so übernommen wie mein erster Vorschlag war:

defmod teleBot_notify_temperatur notify tb_TelegramBot:msgText:.Temp {\
my @devs = devspec2array('temperature<100');;\
return if @devs == 1 && $devs[0] eq 'temperature<100';;\
my @a;;\
for (@devs){my $list = $_ ;;\
$list .= " ".ReadingsNum($_,'temperature','0')." °C\n";;\
push @a,$list;;}\
my $a2s = join q{}, @a;;\
fhem("set tb_TelegramBot message Temp: $a2s");;}
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 07 April 2021, 03:54:47
@TomLee
Ich stehe jetzt offen gesagt ein wenig auf dem Schlauch - ehe ich jetzt wild rumexperimentiere, frage ich Dich lieber, was Du geändert hast und was das bewirkt.
(Für die Fenster nutze ich den Code-Vorschlag von Beta-Tester, siehe unten.)

Zudem zeige ich mal, wie das bei mir gecodet ist und zu meinem Wohlgefallen funktioniert (gern höre ich Deine kritischen Kommentare) - hier wichtig: LaCrosse, weil ich nur diese Sensoren in der anzuzeigenden Liste haben will:


define teleBot_notify_temperatur_2 notify teleBot:msgText:.T { \
my @devs = devspec2array("TYPE=LaCrosse:FILTER=temperature<100");;\
return if @devs == 1;;\
my @a;;\
for (@devs){my $list = $_;;\
$list .= " ".ReadingsNum($_,'temperature','0')." °C\n";;\
push @a,$list;;}\
my $a2s = join q{,}, @a;;\
$a2s =~ s/,//g;;\
fhem("set teleBot message $a2s");;}


@Beta-User
Mir ist nachträglich aufgefallen, dass bei dem Fensterbeispiel der Zweig "Keine offenen Fenster!" nicht funktioniert. Mich persönlich stört das nicht, ich möchte es aber für andere User anmerken.

Ganz allgemein:
Oft ärgert mich, dass ich im Forum was lese, was ich spannend finde. Aber da steht nur "beachte mal Bibliothek libSchnulli" oder "hast Du an Reflex-Flux gedacht" und als Antwort kommt dann "Danke, jetzt funktioniert es" ... das hilft anderen, späteren Lesern genau nichts.

Von daher:
Sehr herzlichen Dank für die veröffentlichten vollständigen Code-Beispiele!
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: TomLee am 07 April 2021, 05:55:45
Meine Frage in #24 war ob der Code dann so OK sei und als Antwort kam:

Zitat von: Beta-User am 05 April 2021, 06:48:20
Zu TomLee's Code noch:
- Einrückungen sind hilfreich, um direkt zu sehen, auf welcher Ebene man ist.
- erst ein join mit Komma, um das dann wieder rauszuregexen, finde ich komisch; nimmt man gleich "join q{}, ...", kann man sich diesen Umweg sparen.
- Wenn schon Code aus der DEF, dann nur mit einem ";"

diese 3 Punkte hab ich dann angepasst und gehe davon aus das die auch passen, da keine Antwort mehr kam die mich korrigiert/verbessert hätte.

Es geht doch eigentlich bloß um diese zwei Zeilen
my $a2s = join q{,}, @a;;\
$a2s =~ s/,//g;;\


weiter oben hast du erwähnt das du das Beispiel in etwa nachvollziehen kannst, les dich nochmal ein zu join was das macht. Beta-User hat doch gleich (zweiter Punkt) erwähnt was daran umständlich/sinnlos umgesetzt war:

Wozu aus dem Array einen Skalar ($a2s) mit Komma zurückgeben um dann die Komma wieder zu entfernen ?


Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 07 April 2021, 16:12:18
Nun ja, wenn man möchte, kann man das ganze auch nur via concatenation lösen, ganz ohne push und join, man muss dann halt die Text-Variable vor der Schleife schon einführen.
Jedenfalls dürfte das hier "theoretisch" zu kurz gegriffen sein:
return if @devs == 1;;\devspec2array liefert nämlich in zwei Fällen ein Array mit genau einem Element zurück: bei Fehlschlag (=>devspec) und wenn es genau einen Treffer gibt. Kann sein, dass mein eq-Vorschlag nicht funktioniert (evtl. muss man klammern, vielleicht geht es so auch gar nicht), aber dann sollte man was anderes machen, z.B. prüfen, ob es $defs{$dev[0]} gibt.

Und ja, auch ich wundere mich gelegentlich, wenn einem "nur" irgendein Stichwort um die Ohren gehauen wird; manche Inhalte hinter den Stichworten sind nämlich nicht so einfach zu finden. Hier dachte ich eigentlich, hinreichend klar verwiesen zu haben (falls das als Kritik gemeint war), da ja die Aussage im Raum stand, es gäbe nichts im Wiki zu devspec2array.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: TomLee am 07 April 2021, 21:33:02
ZitatNun ja, wenn man möchte, kann man das ganze auch nur via concatenation lösen, ganz ohne push und join, man muss dann halt die Text-Variable vor der Schleife schon einführen.

Ich und wsl. nicht nur ich steh da vor einer dicken und ellenlangen Wand und wäre für mehr Hinweise oder ein Beispiel dankbar.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 08 April 2021, 08:33:48
So in der Art eben:
define teleBot_notify_temperatur_2 notify teleBot:msgText:.T { \
  my @devs = devspec2array("FILTER=temperature<100");;\
  return if @devs == 1 && !defined $defs{$devs[0]};;\
  my $list;;\
  for (@devs){\
    $list .= "$_ ".ReadingsNum($_,'temperature','0')." °C\n";;\
  }\
  fhem("set teleBot message $list");;\
}
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: TomLee am 08 April 2021, 11:31:31
Unglaublich wie umständlich man denken kann, Danke.

Einen kleinen Punkt hab ich noch, bei der Einheit muss ja keine Variable aufgelöst werden, daher einfache quotes:

Edit:

Beta-User überlegt erfahrungsgemäẞ bevor er schreibt, wie vorgeschlagen ist es mit mit doppelten quotes richtig:

defmod teleBot_notify_temperatur notify tb_TelegramBot:msgText:.Temp {\
my @devs = devspec2array('temperature<100');;\
return if @devs == 1 && $devs[0] eq 'temperature<100';;\
my $list;;\
for (@devs){\
$list .= "$_ ".ReadingsNum($_,'temperature','0')." °C\n";;\
}\
fhem("set tb_TelegramBot message Temp: $list");;}
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Wzut am 08 April 2021, 17:41:32
Zitat von: TomLee am 08 April 2021, 11:31:31
daher einfache quotes
passt für °C , was aber das CR \n betrifft : teste es :)
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: TomLee am 08 April 2021, 18:13:29
Zitatteste es :)

Tatsache, klappt nicht.
Habs zuvor getestet, aber nicht richtig geschaut (fällt nur in der ersten Zeile auf, siehe Bild), in der App sah es auf den ersten Blick so aus als ob (weil meine Devicenamen so lange sind und sowieso ein Umbruch stattfindet), hätt ich besser mal mit return aus der Kommandozeile getestet.

Ich korrigiere den Beitrag.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 11 April 2021, 03:04:51
Ihr habt Euch ja schön gestritten - ich bin immer wieder beeindruckt, wie man perfekten (und perfekt unverständlichen) Perl-Code schreiben kann. Nein, das ist keine Kritik. Ich kann das halt nicht.

Eins ging unter:

@Beta-User
Mir ist nachträglich aufgefallen, dass bei Deinem Vorschlag für das Fensterbeispiel in #33 der Zweig "Keine offenen Fenster!" nicht funktioniert (oder ich war mal wieder zu blond). Mich persönlich stört das nicht, ich möchte es aber für andere User anmerken.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 11 April 2021, 08:45:19
Es ging nicht unter, nur leider war meine Antwort nicht korrekt...
Zitat von: Beta-User am 07 April 2021, 16:12:18
Jedenfalls dürfte das hier "theoretisch" zu kurz gegriffen sein:
return if @devs == 1;;\devspec2array liefert nämlich in zwei Fällen ein Array mit genau einem Element zurück: bei Fehlschlag (=>devspec) und wenn es genau einen Treffer gibt. Kann sein, dass mein eq-Vorschlag nicht funktioniert (evtl. muss man klammern, vielleicht geht es so auch gar nicht), aber dann sollte man was anderes machen, z.B. prüfen, ob es $defs{$dev[0]} gibt.
Das basierte auf dem Wiki-Eintrag zu devspec2array, was auch der Beobachtung in FHEMWEB entspricht. ABER: Tatsächlich liefert devspec2array aus Perl heraus aufgerufen ein LEERES Array zurück...

Daher zur Belohnung für's Aufspühren dieser kleinen Unsauberkeit hier der funktionierende Code:
defmod teleBot_notify_window notify teleBot:msgText:.Fenster { \
  my @devs = devspec2array('TYPE!~structure:FILTER=state=^open|tilted$');;\
  my $text = !@devs || @devs == 1 && !defined $defs{$devs[0]} ? \
  'Keine offenen Fenster!' : \
  join q{, }, @devs;;\
  fhem "set teleBot message Fenster: $text";;\
}

Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 12 April 2021, 03:38:40
Zitat von: Beta-User am 11 April 2021, 08:45:19
Es ging nicht unter, nur leider war meine Antwort nicht korrekt...

Ich hatte ja die Befürchtung, dass Du mich wegen eines "haste übersehen" in der Luft zerreißen würdest ...

Zitat von: Beta-User am 11 April 2021, 08:45:19
Daher zur Belohnung für's Aufspühren dieser kleinen Unsauberkeit hier der funktionierende Code:

Der Tag wird immer schöner: Ich bedanke mich herzlich.
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 12 April 2021, 07:23:00
Nachtrag noch zu dem Code: Die Doppelung des Rückgabewerts von devspec2array kann man eigentlich auf !@devs beschränken:
defmod teleBot_notify_window notify teleBot:msgText:.Fenster { \
  my @devs = devspec2array('TYPE!~structure:FILTER=state=^open|tilted$');;\
  my $text = !@devs ? \
  'Keine offenen Fenster!' : \
  join q{, }, @devs;;\
  fhem "set teleBot message Fenster: $text";;\
}

Hatte das nur dringelassen, weil der Textteil diese Prüfung so beschrieben hatte.

Propos "in der Luft zerreißen": Einen Verbesserungsvorschlag hätte ich noch: Wäre gleich gekommen (statt "funktioniert nicht"): "Ich bekomme ... gesendet, wenn alle Fenster zu sind", hätte ich ggf. dann nur den Lösungsschnippsel posten können und der eine oder andere hätte es dann vollends selbst finalisieren können, ohne dass ich alles selbst ausprobieren muss  :P ...

Macht in dem Fall aber nichts, weil ich diese Logik eigentlich sowieso vermutet hatte und das dann auch gleich in die aktuelle RHASSPY-Fassung übergenommen habe :) .
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 19 April 2021, 05:58:20
Neues Thema:
Telegram und ReadingsGroup.

ich habe eine schicke Readingsgroup:
Alle Heizkörper, für jeden die Temperatur, den Ventilöffnungsstand, den Restladewert der Batterie. Sieht als Tabelle wirklich schick aus, ist ja eine ReadingsGroup.

Ich würde auf dem Handy nun gern "Heiz" schreiben - und der teleBot antwortet mir mit dem Inhalt der ReadingsGroup - die ist ja schon vorhanden.

Das Forum weiß dazu nichts - lediglich unbeantwortete Anfragen ... geht das denn so einfach, dass ich dem teleBot einfach den Namen der ReadingsGroup mitgebe und das geht dann?

Oder muss ich ich wieder obskure Handstände machen?
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: Beta-User am 19 April 2021, 08:11:33
Vermutlich musst du da schon irgendwie in die Trickkiste greifen. readingsGroup ist dazu gemacht, HTML-code zu erzeugen (wenn er abgefragt wird). So ein list von einer readingsGroup enthält relativ wenige Daten, die man direkt verwenden könnte. Den HTML-Code kann man vermutlich irgendwie abgreifen (macht z.B. FTUI ja auch), aber das solltest du ggf. mal direkt im entsprechenden Forenbereich nachfragen, ob und wie das ggf. geht (und wie man das umwandeln kann).
Titel: Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
Beitrag von: curt am 19 April 2021, 08:43:40
Ja - danke für die Bestätigung.

Ich war unsicher ob meine Einschätzung stimmt - oder ich etwas übersah.