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

Offline curt

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

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14069
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #46 am: 11 April 2021, 08:45:19 »
Es ging nicht unter, nur leider war meine Antwort nicht korrekt...
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";;\
}
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | BT@OpenMQTTGateway
svn:MySensors, WeekdayTimer, RandomTimer, Twilight,  AttrTemplate => {mqtt2, mysensors, zwave}

Offline curt

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

Offline Beta-User

  • Developer
  • Hero Member
  • ****
  • Beiträge: 14069
  • "Developer"?!? Meistens doch eher "User"
Antw:TelegramBot: Ein einzelnes Reading via Handy abfragen?
« Antwort #48 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 :) .
Server: HP-T620@Debian 10, aktuelles FHEM + ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | BT@OpenMQTTGateway
svn:MySensors, WeekdayTimer, RandomTimer, Twilight,  AttrTemplate => {mqtt2, mysensors, zwave}