[gelöst] userReadings Perl mehrere Readings gleichzeitig

Begonnen von curt, 07 August 2019, 00:11:29

Vorheriges Thema - Nächstes Thema

curt

Markierte Zeile
2019-08-09 23:43:20 Nina Nina Warn_01_EventID: BIWAPP-36634

with exactly this event
define Nina_notify_1 notify Nina:Warn_01_EventID:.BIWAPP-36634 {}

with any number matching
define Nina_notify_1 notify Nina:Warn_01_EventID:.BIWAPP.* {}

HINT: An Stelle von BIWAPP kann auch anderes stehen, Beispiel:
2019-08-09 23:43:20 Nina Nina Warn_07_EventID: HOCHWASSERZENTRALEN.DE.BW
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

Dann sollte define ntNina notify Nina:Warn_.*_EventID.* doch triggern.
Poste mal bitte ein "list" vom notify
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

Bitte bedenken: Eigentlich sollen die ersten 30 Zeichen von Warn_??_Instruction in je ein neues Reading kopiert werden, Warn_??_Instruction kommt aber in dem derzeitigen Konstrukt gar nicht vor.

list ntNina

Internals:
   .COMMAND   {my $reading = $EVTPART0; my ($num) = $EVTPART0 =~ /(\d+)/; my $val = substr(ReadingsVal("Nina",$reading,""),0,29); my $num_Wort; fhem("setreading Nina Warn_$num_Wort $val");fhem("deletereading Nina Warn_.*_Wort ");fhem("setreading Nina Warn_$num_Wort $val");}
   DEF        Nina:Warn_.*_EventID.* {my $reading = $EVTPART0; my ($num) = $EVTPART0 =~ /(\d+)/; my $val = substr(ReadingsVal("Nina",$reading,""),0,29); my $num_Wort; fhem("setreading Nina Warn_$num_Wort $val");fhem("deletereading Nina Warn_.*_Wort ");fhem("setreading Nina Warn_$num_Wort $val");}
   FUUID      5d4b14cd-f33f-769b-4fa6-d3d958168fd0b0ef
   NAME       ntNina
   NOTIFYDEV  Nina
   NR         1057
   NTFY_ORDER 50-ntNina
   REGEXP     Nina:Warn_.*_EventID.*
   STATE      2019-08-09 23:43:20
   TRIGGERTIME 1565387000.2926
   TYPE       notify
   .attraggr:
   .attrminint:
   READINGS:
     2019-08-09 21:56:59   state           active
Attributes:
   room       99 System
   verbose    5

RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

#18
Also, der triggert schon:
ZitatSTATE      2019-08-09 23:43:20
   TRIGGERTIME 1565387000.2926

Zitat von: curt am 10 August 2019, 00:37:21
Bitte bedenken: Eigentlich sollen die ersten 30 Zeichen von Warn_??_Instruction in je ein neues Reading kopiert werden, Warn_??_Instruction kommt aber in dem derzeitigen Konstrukt gar nicht vor.

Das habe ich schon lange gesagt: https://forum.fhem.de/index.php/topic,102852.msg965014.html#msg965014
Zitatund in dem substr das richtige Reading umsetzen.
und wieder https://forum.fhem.de/index.php/topic,102852.msg965548.html#msg965548
ZitatDas Konstrukt ist auf jeden Fall noch falsch: wenn  EventID triggern, dann kriegst Du in $reading Warn_nn_EventID. $num wird dann die richtige nn Zahl enthalten, aber $val muss nicht $reading (Warn_nn_EventID) lesen sondern Warn_$num_Instruction.

EDIT: und wenn er wegen $num_Wort meckert, reicht es nicht, einfach in der mitte "my $num_Wort;;" zu setzen. Hast Du überhaupt verstanden, was der Beispielcode machen soll?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

Nein.

Wenn ich das selbst könnte, gäbe es diesen Thread nicht.
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

Wenn Du dich aber mit Perl nicht ein bisschen beschäftigst, wirst Du mit Fhem Schwierigkeiten haben. Du hast schon alle Teile der Lösung.

Wenn z.B. Warn_48_EventID getriggert hat:
my ($num) = $EVTPART0 =~ /(\d+)/;;      #definiert eine Variable $num mit Inhalt = die Nummer, die im triggernden Reading ($EVTPART0 = Warn_48_EventID) steht (z.B. 48)
my $quellReading = "Warn_".$num."_Instruction";;      #Kalkuliert den Name des zu lesenden Readings abhängig von $num (z.B. Warn_48_Instruction)
my $zielReading = "Warn_".$num."_Wort";;      #Kalukiert den Name des zu setzenden Readings abhängig von $num (z.B. Warn_48_Wort)
my $val = substr(ReadingsVal("Nina",$quellReading,""),0,29);;      #Extrahiert in $val die erste 30 Zeichen vom $quellReading

fhem("setreading Nina $zielReading $val");;}      #setze $zielReading vom Device Nina zu Wert $val


Das ganze kann man wahrscheinlich so kürzen, ohne unnötige Zwischenvariable:
{my ($num) = $EVTPART0 =~ /(\d+)/;; fhem("setreading Nina Warn_".$num."_Wort ".substr(ReadingsVal("Nina","Warn_".$num."_Instruction")));;}
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

#21
Zitat von: frank am 09 August 2019, 11:17:44
eventuell auch erstmal mit einem einfachen notify beginnen und [...]

Danke für den Stupser - so testweise umgesetzt mit *LongText - *Instruction kommt ja selten mit und soll (das ist ja eines der Ziele der Operation) bei Nichtexistenz in FTUI/label via autohide ausgeblendet werden.

Zitat von: amenomade am 10 August 2019, 01:29:09
Wenn Du dich aber mit Perl nicht ein bisschen beschäftigst, wirst Du mit Fhem Schwierigkeiten haben.

Es ist kein Vorwurf: Du kannst nicht wissen, was ich mit Perl machte und mache. Ein WebServer "in the wild" besteht ausschließlich aus einem CGI-Interface, welches von Perl bedient wird - ich bin mir sicher, dass Du den WebServer schon kontaktiert hast. Nein, das ist kein kleines Script.

In aller demütiger Bescheidenheit scheint mir das Problem (oder auch nur mein Problem) mit FHEM und Perl zu sein, dass das nicht konsistent ist. An jeder Ecke eine Sonderlocke. Und wenn es keine Sonderlocke ist, dann liest Du bei der Recherche Beiträge des Tonfalls 'Du musst mal lernen, dass das FHEM-Perl nicht wirklich Perl ist, das ist anders'.

Ähmmm. Aha.

Zitat von: amenomade am 10 August 2019, 01:29:09
Du hast schon alle Teile der Lösung.

Ich teste mit *LongText, da *Instruction im Friedensfall eher selten mitgegeben wird (aber eine Katastrophen-Warn-Device schon auf den auf den ganz seltenen "Kriegsfall", also Katastrophenfall zugeschnitten ist), sonst könnten wir uns den Zinnober ja sparen.

Dieser Code (hier: *LongText) funktioniert:

define ntNina notify Nina:Warn_.*_EventID.* {my ($num) = $EVTPART0 =~ /(\d+)/;;;; my $quellReading = "Warn_".$num."_LongText";;;; \
my $zielReading = "Warn_".$num."_Wort";;;; my $val = substr(ReadingsVal("Nina",$quellReading,""),0,29);;;; fhem("setreading Nina $zielReading $val");;;;}


Was ich (die Zeit fehlte) noch nicht sagen kann: Wie FTUI/Label/autohide real umgeht, also ob ein Ereignis "33" noch existiert, wenn es aktuell aber nur 22 Ereignisse gibt. Der Thread ist also noch nicht erledigt.

@amenomade
Ich weiß, dass Du im Anfängerthread selbstlos hilfst: Dir gebührt mein besonderer Dank. Und ich danke allen, die uns in der Diskussion schrittweise näher zur Lösung brachten.

Ich wünsche allen ein wunderschönes Wochenende
(und drohe für die nächsten Tage einen weiteren Beitrag zur Sache an ...)
RPI 4 - Jeelink HomeMatic Z-Wave

amenomade

#22
Zitat von: curt am 10 August 2019, 05:31:43

Was ich (die Zeit fehlte) noch nicht sagen kann: Wie FTUI/Label/autohide real umgeht, also ob ein Ereignis "33" noch existiert, wenn es aktuell aber nur 22 Ereignisse gibt. Der Thread ist also noch nicht erledigt.
Das ist was ich hieroben mit "Ich weiss aber nicht genau wie Das Modul funktioniert." meinte. Wenn das so ist, dass die "Ereignisse" (sagen wir eher die Readings) irgendwie ablaufen, muss man dann ja mit einer Schleife arbeiten. Da muss man den richtigen Kompromiss finden, zwischen "ich kalkuliere alle Readings bei jedem Ereignis" und "ich kalkulieren nur diejenige, die geändert wurden".

EDIT:
ZitatDu kannst nicht wissen, was ich mit Perl machte und mache. Ein WebServer "in the wild" besteht ausschließlich aus einem CGI-Interface, welches von Perl bedient wird - ich bin mir sicher, dass Du den WebServer schon kontaktiert hast. Nein, das ist kein kleines Script.
... Bin mal neugierig... :) ???
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

curt

#23
Zwischenstand:

Bei einer testweisen Nutzung eines anderen Readings funktioniert sowohl das notify als auch die daran anknüpfende Darstellung in FTUI.

Bei dem eigentlich gewollten Quellreading (Warn_??_Instruction) ist die Sache schwieriger: Das taucht selten auf (daher will ich den Link bei Nichtexistenz ja ausblenden). Leider habe ich das Reading zu meinen Hobbyzeiten noch nicht wieder gesehen, kann also noch nicht final berichten.

Ich habe das weiter im Auge und werde bei Erfolg den von mir genutzten Code (notify sowie FTUI) hier veröffentlichen, anschließend den Thread als "gelöst" markieren.
RPI 4 - Jeelink HomeMatic Z-Wave

frank

die wettermeldungen haben, glaube ich, immer instruction.
also zum testen ideal.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

curt

Zitat von: frank am 15 August 2019, 09:50:17
die wettermeldungen haben, glaube ich, immer instruction.
also zum testen ideal.

Ahh, gut, geht. Damit also:

Das von mir genutzte notify:

define ntNina notify Nina:Warn_.*_EventID.* {my ($num) = $EVTPART0 =~ /(\d+)/;;;; my $quellReading = "Warn_".$num."_Instruction";;;; \
my $zielReading = "Warn_".$num."_Wort";;;; my $val = substr(ReadingsVal("Nina",$quellReading,""),0,29);;;; fhem("setreading Nina $zielReading $val");;;;}


Und beispielhaft in FTUI so genutzt:

     <div data-type="popup"
          data-height="350px"
          data-width="600px"
          onclick="$('.dialog-close').trigger('click');"
          class="inline">

             <div data-type="label" data-device="Nina"
        data-get="Warn_00_Wort"
        data-unit=""
        data-pre-text="&nbsp; &nbsp;"
        class="inline yellow nocache autohide" align="left">
      </div>

        <div class="dialog">
        <div data-type="label" data-device="Nina"
             data-get="Warn_00_Instruction"
             data-unit=""
             class="nocache autohide" align="left">
        </div>
       </div>
     </div>


Ich danke allen, die sich an der Diskussion beteiligten und mithalfen.

Weitere Verbesserungen, Hinweise gern gesehen.
RPI 4 - Jeelink HomeMatic Z-Wave