TelegramBot: Ein einzelnes Reading via Handy abfragen?

Begonnen von curt, 17 September 2019, 02:17:33

Vorheriges Thema - Nächstes Thema

binford6000

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

Meck

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.

flummy1978

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 ?

curt

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?
RPI 4 - Jeelink HomeMatic Z-Wave

Beta-User

a) direktes cfg-Editieren;
b) notify in der DEF unterschlagen...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

curt

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?
RPI 4 - Jeelink HomeMatic Z-Wave

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

curt

#22
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.
RPI 4 - Jeelink HomeMatic Z-Wave

Beta-User

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.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

TomLee

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

curt

Oh, das funktioniert super: Danke @TomLee. Und danke @Beta_User.
RPI 4 - Jeelink HomeMatic Z-Wave

curt

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.)
RPI 4 - Jeelink HomeMatic Z-Wave

Beta-User

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...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

curt

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?
RPI 4 - Jeelink HomeMatic Z-Wave

Beta-User

Es gibt eine Doku: https://wiki.fhem.de/wiki/DevelopmentModuleAPI#devspec2array

Grundsätzlich funktioniert das via 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!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files