eventMap: '20'=>'pct 20' mach einfach pct 0 andere Werte haben das Problem auch

Begonnen von Master_Nick, 25 Oktober 2019, 17:36:56

Vorheriges Thema - Nächstes Thema

Master_Nick

Moin :-)

Um meinen Rolladen der von 0 bis 200 steuerbar ist zumindest (Amazon limitierung wie es scheint) bis 100% (das ist bei mir Rolladen runter aber alle Schlitze offen) mittels Sprache steuern zu können habe ich nun auf pct im reading umgegebaut.
Damit ich aber weiter 0 bis 200 und nicht pct 0 pct 10 in FHEM stehen habe habe ich mir eine eventMap erstellt:

{ usr=>{ 'auf'=>'pct 0', '0'=>'pct 0', '10'=>'pct 10', '20'=>'pct 20', '30'=>'pct 30', '40'=>'pct 40', '50'=>'pct 50', '60'=>'pct 60', '70'=>'pct 70', '80'=>'pct 80', '90'=>'pct 90', '100'=>'pct 100', '110'=>'pct 110', '120'=>'pct 120', '130'=>'pct 130', '140'=>'pct 140', '150'=>'pct 150', '160'=>'pct 160', '170'=>'pct 170', '180'=>'pct 180', '190'=>'pct 190', 'zu'=>'pct 200' } }

Nun es gehen auch einige Teile :-D aber z. B. 190 ist 90 ?!?  und 150 ergibt 50

Hä :-D  :o
Hab ich da nun grob was falsch gemacht oder bin ich in einen Bug gestolpert?
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Beta-User

Würde mal darauf tippen, dass da regex "schuld" ist. Bei der Suche nach "20" matcht eben nicht nur "20", sondern auch "A20", "120", "520", und es liegt nahe, dass das in "order of appearance" geprüft wird. Also: Reihenfolge ändern, oder die Regex eindeutiger machen, vielleicht klappt es dann ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Master_Nick

Ach das ist ein Regex :-D

Das hatte ich kurz im Commandref überlesen :-D Danke
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

Beta-User

Na ja, nicht ganz, das ist eher ein verschachtelter (Teil-) Hash, aus dem dann Angaben für regex-Prüfungen entnommen werden (die keys aus dem inneren Hash). Ist zwar auch nur eine Beschreibung "der Spur nach", aber  eigentlich ist interessanter, ob das umdrehen hilft (erst die speziellere Angabe, dann die weniger spezielle usw.)?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Master_Nick

Also ich hab es jetzt so bauen wollen aber $1 oder \1  gehen nicht ;-D
Auf und zu hab ich dabei erstmal komplett raus gelassen.

{ usr=>{'[\d{2-3}]'=>'pct $1' } }


Wahrscheinlich eben weil es nicht ganz Regex ist ;-D

Wäre halt auch deutlich effizienter die Art es so zu schreiben. Fehlt halt noch das einsetzen des match ;-D

*EDIT* Haha ok das will so wohl gar nicht laut log:

2019.10.25 19:20:17 1: PERL WARNING: Unrecognized escape \d passed through at (eval 9455) line 1.
2019.10.25 19:20:19 1: PERL WARNING: Use of uninitialized value $1 in concatenation (.) or string at (eval 9458) line 1.

Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

rudolfkoenig

- es ist ein hash, und da die Elemente nicht sortiert werden, ist die Reihenfolge unbestimmt.
- fuer diese (unsortierte) Liste wird bei jedem Element erst geprueft, ob es genau zutrifft (dann wird der Wert genommen), und danach, ob es als regexp matcht (dann wird der Wert als Perl-Expression evaluiert).
- $1 kann man nur dann verwenden, wenn im Regexp es per () gefuellt wurde.
Beispiel:eventMap   { usr => { '^(\d+) C$'=>'".($1*1.8+32)." F' } }
setzt den Status von dummy nach "set dummy 32 C" auf "89.6 F".
Die zwei komisch erscheinenden " sind kein Fehler: der Wert wird in " eingepackt evaluiert, damit man auch einfach STRING schreiben kann.

Beta-User

Wieder was gelernt bzw. was für meine "könnte man mal brauchen"-Liste  :) .

Insgesamt ist das mit den eventMap-Elementen bisher eher selten hier diskutiert gewesen (meine Vermutung: >95% der user haben die gesplittete ("usr => ...")-Version noch nie gesehen), von daher ist diese erklärte "extended version" hier sehr aufschlußreich, Danke!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Master_Nick

Nabend,

vielen Dank erstmal für die Ausführung :-)

So wirklich Licht bringt  mir das aktuell noch nicht.
- Wie sieht der Hash aus und was ist es für ein Hash? (gibt ja durchaus einige Variatonen)
- Ich finde keine wirkliche Übersicht welche Regex Perl akzeptiert (ja im Wiki gibt es was.... das ist aber gegen z. B. Regex101.com nicht wirklich der Knaller ;-D (nur das das eben Perl außen vor lässt).
- ^ Anfang des pattern match?
- $ Ende des pattern match?

Aber ich versuch nun einfach mal, dass aus deinem Beispiel um zumogeln zu einem was mir passt.
Selbst wenn ich dabei erfolgreich wäre, hätte ich es aber dennoch nicht ganz verstanden - daher die Fragen :-D

Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

amenomade

Die Struktur des Hashs ist in CommandRef beschrieben: https://fhem.de/commandref_DE.html#eventMap
Das ist ein ganz normales Perl Hash http://www.mathe2.uni-bayreuth.de/perl/GK/hashes.htm

Perl akzeptiert grundsätzlich die gleiche Regex wie PHP: PCRE = Perl compatible regular expression. Siehe Regex101
Wenn Du dort eine Regex eingibst, erklärt die Webseite rechts Schritt für Schritt wie die Regex interpretiert wird.
Z.B
^ asserts position at start of a line
$ asserts position at the end of a line


^part = matcht was mit "part" anfängt
part$ = matcht was mit "part" endet
part = matcht was "part" enthält, egal die Position und die Länge
^part$ = matcht nur Strings, die genau gleich "part" sind.

Eine Einführung in Regex findest Du hier: https://perldoc.perl.org/perlre.html
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Master_Nick

Danke für die Erklärungen - hat geholfen :-D

Ich habe mir tatsächlich einfach die Zeit gelassen, bis ich Zeit hatte zu lesen und zu verstehen. (Macht man echt zu selten!)   ;D
Eigentlich war es nicht soweit von dem weg wie ich es bauen wollte :-D es gab nur kleine verschiedenheiten im Regex dann - oder ich bin noch nicht durch mit verstehen.

Aber es funktioniert!  8) (mit der Warnmeldungen zweie)

Meine Eventmap:

{ usr=>{ 'auf'=>'pct 0', 'zu'=>'pct 200', '^(\d{2,3})$' => 'pct $1' } }


Aus "70" im device als Webcmd wird nun
2019-11-18 21:57:56 MQTT_DEVICE Rolladen_AZ pct: 70  :)

Ich bekomme allerdings zwei Warnungen:

2019.11.18 21:57:37 1: PERL WARNING: Unrecognized escape \d passed through at (eval 439818) line 1.
2019.11.18 21:57:37 1: ERROR evaluating {ReadingsVal("Rolladen_AZ","^(\d{2,3})$","")}: Final $ should be \$ or $name at (eval 439818) line 1, within string
syntax error at (eval 439818) line 1, near ","^(\d{2,3})$""


Laut Regex101 mit setting PCRE ist \d "any digit". Warum wird es hier angekreidet?  :o
Ein \$ am Ende sorgt an egal welcher Position der "$" für nicht mehr vorhandene funktionalität


*Edit - habe gerade noch einen Gedanken - zündet die Eventmap NUR für das Device oder hab ich mir ggf nun was gebaut wo auf 2 bis 3 stellige Zahlen aller Art reagiert wird :D


Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)

rudolfkoenig

Zitatzündet die Eventmap NUR für das Device oder hab ich mir ggf nun was gebaut wo auf 2 bis 3 stellige Zahlen aller Art reagiert wird
Ein (eventMap) Attribut gilt nur fuer das betroffene Device.


Ich konnte die gezeigten Fehlermeldungen mit
define d dummyattr d setList    pct auf zu 112 13 14
attr d eventMap   { usr=>{ 'auf'=>'pct 0', 'zu'=>'pct 200', '^(\d{2,3})$' => 'pct $1' } }
nicht nachstellen. Falls Du das Problem mit was vergleichbar Einfaches zeigen kannst, dann waere ich dankbar.

Sonst: bitte "attr global stacktrace" setzen, dann haette ich grob eine Ahnung, wo das Problem herkommt.


Master_Nick

 ;D

Witzig - unerklärlich für mich warum - aber ich habe nicht getan außer das Tab und Browser vorhin zu schließen - und nun bekomme ich auch keine Meldung mehr im Log.
D.h. es läuft sauber :-)

Seltsam bleibt das aber. Kann es nicht mehr nachstellen.


Somit bedanke ich mich und muss sagen - schön erklärt mit Beispiel, etwas Lektüre und Tools. :-)
Top - ich freu mich.
Rancher K8s Cluster mit nanoCUL (a-culfw) | IObroker | IT(V1&V3), IT-PIR, THGR122NX |Co² | alexa-fhem | WOL | NFC | Harmony UltimateHub | Anwesenheitserkennnung | Roomba | 10" Touch mit Node-Red | SonOff S20 | SonOff Touch | SonOff Dual | Rolladen | Und ganz viel anderes tolles Gerödel.... ;-)