Autor Thema: TelegramBot: Ein einzelnes Reading via Handy abfragen?  (Gelesen 4769 mal)

Offline curt

  • Hero Member
  • *****
  • Beiträge: 1284
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #30 am: 05 April 2021, 07:46:12 »
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.
RPI 4 - Jeelink HomeMatic Z-Wave

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14105
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #31 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
Zitat
      Um 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.
Server: HP-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline curt

  • Hero Member
  • *****
  • Beiträge: 1284
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #32 am: 05 April 2021, 10:45:28 »
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.

(Was wird denn geliefert, und was steht in FensterStatus).

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

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

Hmmm. Spannend, siehe unten!

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");;}
« Letzte Änderung: 05 April 2021, 10:51:47 von curt »
RPI 4 - Jeelink HomeMatic Z-Wave

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14105
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #33 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
« Letzte Änderung: 06 April 2021, 14:43:33 von Beta-User »
Server: HP-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline curt

  • Hero Member
  • *****
  • Beiträge: 1284
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #34 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$ .
RPI 4 - Jeelink HomeMatic Z-Wave

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14105
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #35 am: 06 April 2021, 14:47:26 »
Danke auch für die Rückmeldung, den Typo habe ich korrigiert.
Server: HP-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3087
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #36 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");;}

Offline curt

  • Hero Member
  • *****
  • Beiträge: 1284
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #37 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!
« Letzte Änderung: 07 April 2021, 03:57:03 von curt »
RPI 4 - Jeelink HomeMatic Z-Wave

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3087
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #38 am: 07 April 2021, 05:55:45 »
Meine Frage in #24 war ob der Code dann so OK sei und als Antwort kam:

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 ?


« Letzte Änderung: 07 April 2021, 06:48:08 von TomLee »

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14105
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #39 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.
Server: HP-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3087
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #40 am: 07 April 2021, 21:33:02 »
Zitat
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.

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.

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14105
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #41 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");;\
}
Server: HP-T620@Debian 10, 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:MySensors, Weekday-&RandomTimer, Twilight,  AttrTemplate {u.a. mqtt2, mysensors, zwave}
Hilfreich Hilfreich x 1 Liste anzeigen

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3087
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #42 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");;}
« Letzte Änderung: 08 April 2021, 18:20:36 von TomLee »

Offline Wzut

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4432
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #43 am: 08 April 2021, 17:41:32 »
daher einfache quotes
passt für °C , was aber das CR \n betrifft : teste es :)
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Offline TomLee

  • Hero Member
  • *****
  • Beiträge: 3087
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #44 am: 08 April 2021, 18:13:29 »
Zitat
teste 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.

 

decade-submarginal