[erledigt] doif mit perl-code - wie url richtigen escapen?

Begonnen von Thomas41587, 14 August 2020, 15:12:44

Vorheriges Thema - Nächstes Thema

Thomas41587

Hallo zusammen,
ich verzweifle ein wenig mit meinem DOIF. Es soll geprüft werden, ob die aktuelle URL auf dem Tablet die index.html ist. Falls nein, soll sie geladen werden.
Aber egal mit welchen (zusätzlichen) Anführungszeichen oder Backslashes ich es probiere - es kommt immer wieder folgender Fehler

condition c03: syntax error at (eval 150415) line 3, near "192.168.1.2:"
Unknown regexp modifier "/e" at (eval 150415) line 3, at end of line
syntax error at (eval 150415) line 7, near ";
  }"


Das ist der Codeblock des DOIF:

lichtschranke {
  if( ([S7_DRead_aussenbereich_lichtschranke_hof:state] eq "on" && (ReadingsVal("dummy_tablet_in_wandhalterung","state",0) =~ /^on/) && (ReadingsVal("Bewohner","state",0) =~ /^home/)) || [dummy_test1:state] eq "on" ){
    if( !(ReadingsVal("fully_galaxy_tab","current_page",0) =~ /^http://192.168.1.2:8083/fhem/ftui/index.html/) ){
      fhem("set fully_galaxy_tab url http://192.168.1.2:8083/fhem/ftui/index.html");
    }
    fhem("set dummy_kamerabild_in_tablet_ui_aktivieren on-for-timer 60");
  }
}


Was genau mache ich hier falsch?

Otto123

Hi,

auf alle Fälle stören die /
http://192.168.1.2:8083/fhem/ftui/index.html -> http:\/\/192.168.1.2:8083\/fhem\/ftui\/index.html

Ich bin nicht sicher ob das alles ist ;)

Du könntest auch einfach einen Teil testen:
=~ /index.html/

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Thomas41587

Zitat von: Otto123 am 14 August 2020, 15:23:46

http://192.168.1.2:8083/fhem/ftui/index.html -> http:\/\/192.168.1.2:8083\/fhem\/ftui\/index.html

Hi Otto, den Versuch hatte ich auch schon gewagt - gleiche Fehlermeldung :-(

Wzut

#3
ReadingsVal("fully_galaxy_tab","current_page",0)  -> ReadingsVal('fully_galaxy_tab', 'current_page', '') , (das mit der 0 statt String bei Val machst du gern , bei ReadingsNum wäre es ok)
if( !(ReadingsVal("fully_galaxy_tab","current_page",0) =~ /^http://192.168.1.2:8083/fhem/ftui/index.html/) ){
wird dann ganz simpel zu
if (ReadingsVal('fully_galaxy_tab', 'current_page', '') ne 'http://192.168.1.2:8083/fhem/ftui/index.htm') {

Axo , den Umweg Perl -> FHEM -> Perl kannst du auch gleich einsparen :
fhem("set fully_galaxy_tab url http://192.168.1.2:8083/fhem/ftui/index.html");
fhem("set dummy_kamerabild_in_tablet_ui_aktivieren on-for-timer 60");


CommandSet(undef, 'fully_galaxy_tab url http://192.168.1.2:8083/fhem/ftui/index.html');
CommandSet(undef, 'dummy_kamerabild_in_tablet_ui_aktivieren on-for-timer 60');
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Thomas41587

Vielen Dank für die zusätzlichen Tipps. Ich bin tatsächlich was Perl-Skripte betrifft noch ganz am Anfang.

if (ReadingsVal('fully_galaxy_tab', 'current_page', '') ne 'http://192.168.1.2:8083/fhem/ftui/index.htm') {
Funktioniert super, vielen Dank! Werde es mir auch versuchen zu merken, mit einfachen Anführungsstrichen zu arbeiten und nicht auf "0" zu setzen :-)

Was allerdings nicht funktioniert sind die beiden "CommandSet". Füge ich das ein, kommt folgender Fehler:
condition c03: Undefined subroutine &DOIF::CommandSet called, line 4.
Ist da eventuell noch ein Fehler drin? Was genau hat es eigentlich mit CommandSet auf sich, wirklich viel habe ich dazu nicht gefunden...

Vorerst habe ich es so geändert:
fhem('set fully_galaxy_tab url http://192.168.1.2:8083/fhem/ftui/index.html');
Damit geht es jetzt wenigstens :-) Über eine Aufklärung zu CommandSet würde ich mich aber trotzdem freuen. Was hat dieser Weg für Vorteile und wie/wann ist er anzuwenden?

Wzut

Zitat von: Thomas41587 am 14 August 2020, 19:30:08
Ist da eventuell noch ein Fehler drin? Was genau hat es eigentlich mit CommandSet auf sich, wirklich viel habe ich dazu nicht gefunden...
Vermutlich wird es einfach von DOIF nicht direkt unterstützt, in einem notify oder at oder eigener sub kann man das ohne Probleme einsetzen, sorry.
CommandSet ist die sub die innerhalb von fhem.pl in Wahrheit die Arbeit macht, wenn man ein set Kommando an FHEM übergibt. CommandXXX hat noch jede Menge Brüder, einfach mal etwas in fhem.pl stöbern. Man könnte auch ein Reading noch direkter setzen aber so bleibt die Syntaxprüfung erhalten und was IMHO fast noch wichtiger ist (und viel zu selten geschrieben wird) die Übergabe als Gruppe. Man sieht oft solche Teile :
set lampe on; set licht on; set tv on; usw. statt das einfach mit set lamp,licht,tv on zu erschlagen.
Maintainer der Module: MAX, MPD, UbiquitiMP, UbiquitiOut, SIP, BEOK, readingsWatcher

Damian

#6
commandSet ist im DOIF Perl-Modus:

fhem_set https://fhem.de/commandref_DE.html#DOIF_fhem_set
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Thomas41587

Danke für die Aufklärung! Dann werde ich zukünftig den "direkten" Weg mit commandSet bzw. fhem_set nehmen :-)

Damian

Zitat von: Thomas41587 am 17 August 2020, 11:57:22
Danke für die Aufklärung! Dann werde ich zukünftig den "direkten" Weg mit commandSet bzw. fhem_set nehmen :-)

ja, fhem_set ruft commandSet selbst auf befindet sich aber im passenden Package "DOIF"
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF