klick auf Onlinestatus vom MQTT Device öffnet Webseite

Begonnen von fervor, 26 Dezember 2019, 15:07:56

Vorheriges Thema - Nächstes Thema

fervor

Hi, ich komme mit den Templates der MQTT2_Devices irgendwie nicht klar und brauch wegen meiner limitierten perl Kenntnisse ein bisschen Hilfe bei einer Tasmota geflashten Steckdose.

Mein stateFormat sieht so aus
1:POWER1
2:LWT

mein entsprechende devStateIcon
attr Tasmota_Test devStateIcon  1.on:light_light_dim_100@orange:off 1.off:light_light_dim_00@gray:on 2.Online:10px-kreis-gruen 2.Offline:10px-kreis-rot


Ich würde nun gern im Fall, das das Gerät Online ist auf den grüen Punkt klicken können und dann auf einem neuen Tab landen der die jeweilige Tasmota Webseite öffnet.
Also irgendwie sowas  <a target="_blank" href="http://192.168.xxx.xxx"></a>

Ich habe dazu analog zum Shelly die statische ip als userReadings definiert.


Ich hatte versucht das von den Shelly Templates abzukupfern, komme aber nicht mit der Syntax klar. Wäre super, wenn mir Jemand helfen könnte :-)

Besten Dank



defmod Tasmota_Test MQTT2_DEVICE
attr Tasmota_Test IODev MQTT2_CLIENT2MOSQUITTO
attr Tasmota_Test devStateIcon 1.on:light_light_dim_100@orange:off 1.off:light_light_dim_00@gray:on 2.Online:10px-kreis-gruen 2.Offline:10px-kreis-rot
attr Tasmota_Test readingList Smarthome/PC/PC.Beleuchtung/tele/LWT:.* LWT\
Smarthome/PC/PC.Beleuchtung/tele/STATE:.* { json2nameValue($EVENT) }\
Smarthome/PC/PC.Beleuchtung/tele/SENSOR:.* { json2nameValue($EVENT) }\
Smarthome/PC/PC.Beleuchtung/stat/POWER:.* state\
Smarthome/PC/PC.Beleuchtung/stat/RESULT:.* { json2nameValue($EVENT) }
attr Tasmota_Test room Entwicklung
attr Tasmota_Test setList off:noArg    Smarthome/PC/PC.Beleuchtung/cmnd/POWER off\
on:noArg     Smarthome/PC/PC.Beleuchtung/cmnd/POWER on\
toggle:noArg Smarthome/PC/PC.Beleuchtung/cmnd/POWER toggle
attr Tasmota_Test stateFormat 1:POWER1\
2:LWT
attr Tasmota_Test userReadings ip

Otto123

Hi,

ich will Dir das nicht komplett lösen, aber ich habe hab mal geändert und zusammengestrichen. Vielleicht kommst Du so weiter:
attr Tasmota_Test devStateIcon {my $onl = "gruen";; my $light = InternalVal($name,"STATE","off");; my $show = '<a href="';;$show .= $onl eq "gelb" ? "/fhem?cmd.dummy=set $name x_update&XHR=1\">" : "http://".ReadingsVal($name,"IPAddress","none").' "target="_blank">';;$show .= FW_makeImage("10px-kreis-".$onl)."</a>";; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a>" }

Funktioniert bei mir bei dem hier:
defmod MQTT2_DVES_A52F4C MQTT2_DEVICE DVES_A52F4C
attr MQTT2_DVES_A52F4C IODev mqtt2s
attr MQTT2_DVES_A52F4C autocreate 0
attr MQTT2_DVES_A52F4C comment NOTE: on-for-timer is limited to 18h max duration!
attr MQTT2_DVES_A52F4C devStateIcon {my $onl = "gruen";;;; my $light = InternalVal($name,"STATE","off");;;; my $show = '<a href="';;;;$show .= $onl eq "gelb" ? "/fhem?cmd.dummy=set $name x_update&XHR=1\">" : "http://".ReadingsVal($name,"IPAddress","none").' "target="_blank">';;;;$show .= FW_makeImage("10px-kreis-".$onl)."</a>";;;; "<div> $show <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($light)."</a>" }
attr MQTT2_DVES_A52F4C icon hue_filled_outlet
attr MQTT2_DVES_A52F4C model tasmota_basic_state_power1
attr MQTT2_DVES_A52F4C readingList tele/sonoff_A52F4C/LWT:.* LWT\
  tele/sonoff_A52F4C/STATE:.* { json2nameValue($EVENT) }\
  tele/sonoff_A52F4C/SENSOR:.* { json2nameValue($EVENT) }\
  tele/sonoff_A52F4C/INFO.:.* { json2nameValue($EVENT) }\
  stat/sonoff_A52F4C/RESULT:.* { json2nameValue($EVENT) }
attr MQTT2_DVES_A52F4C room MQTT2_DEVICE
attr MQTT2_DVES_A52F4C setList off:noArg    cmnd/sonoff_A52F4C/POWER1 0\
  on:noArg     cmnd/sonoff_A52F4C/POWER1 1\
  toggle:noArg cmnd/sonoff_A52F4C/POWER1 2\
  on-for-timer {my $duration = $EVTPART1 < 11.2 ? $EVTPART1*10 : $EVTPART1+100;; 'cmnd/sonoff_A52F4C/Backlog pulseTime1 '.$duration.';; POWER1 1'}\
  setOtaUrl:textField cmnd/sonoff_A52F4C/OtaUrl $EVTPART1\
  upgrade:noArg   cmnd/sonoff_A52F4C/upgrade 1
attr MQTT2_DVES_A52F4C setStateList on off toggle
attr MQTT2_DVES_A52F4C stateFormat POWER1


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

xenos1984

@Otto123: Sollte da ans Ende vom devStateIcon noch ein schließendes "</div>"?

Otto123

#3
sagen wir mal so: Ich habe meine Version des Shellyplug (erstellt vor ein paar Wochen) als Vorlage verwendet, da ist es auch nicht drin  :-[
Ja ich habe mich auf den gefragten Link konzentriert und nicht komplett versucht alles zu verstehen ;) Es muss also mal im template so gewesen sein, mal sehen was passiert wenn ich ein update fahre und dann nochmal das Template anwende.

Edit nach Kontrolle:
Das ändert sich nicht, da ist wohl ein Fehler im Template shelly1

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

fervor

#4
@Otto

ich fürchte so richtig schlau werde ich nicht daraus. Ich wollte den Onlinestatus aus dem LWT nehmen. Du verzichtest anscheinend darauf.
Mir fehlen auch ein paar Sachen um das Konstrukt zu verstehen:


  • was macht .=    wird hier was verkettet? - gerade getestet, scheint wohl so
  • was macht ?- auch getestet, ist jetzt klar
  • warum können hier vor und nach dem : Leerzeichen stehen? Sonst wird das doch explizit vermieden.

Mit deinem setup bekomme ich immerhin schon mal 2 klickbare Punkte und den status ausgegeben. Nur mit den Anpassungen an meinen Fall hapert es noch.

VG

PS:

hab versucht in der html Schreibweise meinen Schalter nachzubauen, leider ohne Erfolg. Irgendwie scheint es, dass diese Funktionalität dann nicht mehr gegeben ist.

{my $show = "1.on:";;$show .= FW_makeImage('light_light_dim_100@orange');;$show .= "off 1.off:";;$show .= FW_makeImage('light_light_dim_100@gray');;$show .= "on";; $show}

Otto123

Ich habe in meinem Beispiel den Online Status erstmal rausgelassen, ich fand den nebensächlich/andere Baustelle :)
Deine drei Fragen:
1. mir hilft immer Blättern in dem Buch weiter ;) https://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
    und noch viel mehr hilft einfach probieren, z.B. in der FHEM Kommandozeile
{my $a="w";;$a .= "illi"}
Alles klar?
2. und 3. Ist die Kurzform einer Abfrage in Perl:
{if (1==1) {return "willi"} else {return "wups"}} kannst Du auch so schreiben
{(1==1) ? "willi":"wups"}Leerzeichen sind dort egal.

Habe ich deine Fragen so richtig verstanden?

ich verwende in meinem Beispiel deinen status der nicht in state sondern in STATE steht. Und die IP Adresse die in IPAddress steht. Funktioniert das soweit?

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

fervor

Hallo,

ja, dass waren meine Fragen - hatte auch ein bisschen rumprobiert und bin zum gleichen Ergebnis gekommen. Besten Dank für den Link, hatte bei meiner Recherche nix passendes gefunden - denke mal hier findet man so ziemlich alles. ;)

Auch mit dem state / STATE bzw. ip / IPAddress ist mir klar.

Ich wollte den Schalter
attr Tasmota_Test devStateIcon  1.on:light_light_dim_100@orange:off 1.off:light_light_dim_00@gray:on

in kleinen Schritten erstmal mit

{my $show = "1.on:";;$show .= FW_makeImage('light_light_dim_100@orange');;$show .= "off 1.off:";;$show .= FW_makeImage('light_light_dim_100@gray');;$show .= "on";; $show}

nachbauen / zum Laufen bringen, um dann den Onlinestatus einzubauen. Das klappt aber nicht, das Icon wird nicht angezeigt und man kann auch nix mehr schalten.

Hiermit wird das Icon aber korrekt angezeigt
{FW_makeImage('light_light_dim_100@orange')}

nur die Kombination aus "aktivem Schalter" (1.on:icon@color:off 2.off:icon@color:on ) und html Interpretation zwischen {} klappt nicht.

Ist das überhaupt möglich?

VG

TomLee

ZitatIch würde nun gern im Fall, das das Gerät Online ist auf den grüen Punkt klicken können und dann auf einem neuen Tab landen der die jeweilige Tasmota Webseite öffnet.

Hallo,

hab mir nicht jeden Beitrag genau durchgelesen, war mir zu kompliziert, auf die obige Frage hätte ich folgendes devStateIcon als Vorschlag:

{my $onl = ReadingsVal($name,"LWT","0") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";;"<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a>"}

Gruß

Thomas

Otto123

Ich bin auch nicht der devStateIcon Spezi, aber fangen wir mal Schritt für Schritt an:

Was muss rauskommen? Sowas: STATE:Icon:Befehl -> https://fhem.de/commandref_DE.html#devStateIcon
Also das funktioniert:
1.on:light_light_dim_100@orange:off
als Perl Variante wäre das:
{my $show = "1.on:light_light_dim_100\@orange:off"}
Könnte man jetzt auch so schreiben:
{my $show = "on:";;$show.="light_light_dim_100\@orange";;$show.=":off"}
Merkst Du schon was bei Dir falsch war?

Mit der Herleitung des HTTP Links brauch ich noch ein bisschen :)
Edit: Aber Thomas hatte einen Vorschlag  ;)

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

fervor

#9
Hallo Otto,

habs jetzt gesehen, puh
{my $show = "1.on:";;$show .= "light_light_dim_100\@orange";;$show .= ":off 1.off:";;$show .= "light_light_dim_100\@gray";;$show .= ":on 2.Online:";;$show .= "10px-kreis-gruen";;$show .= " 2.Offline:";;$show .= "10px-kreis-rot";; $show}
funktioniert erstmal wie die Ursprungsversion

nun hab ich versucht an 2.Online: den link anzuhängen
{my $show = "2.Online:";;$show .= '<a href="http://'.ReadingsVal("Tasmota_Test","ip","none").'" target="_blank">';;$show .= FW_makeImage("10px-kreis-gruen")."</a>";; $show}
wird zu
2.Online:<a href="http://192.168.0.102" target="_blank"><img class=' 10px-kreis-gruen' src="/fhem/images/default/10px-kreis-gruen.png" alt="10px-kreis-gruen" title="10px-kreis-gruen"></a> 
ersetzt

nur klappt das dann nicht mehr

Die Variante von Thomas funktioniert
{my $onl = ReadingsVal("Tasmota_Test","LWT","0") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";;"<a href=\"http://".ReadingsVal("Tasmota_Test","ip","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a>"}
wenn man nur einen Status ausgeben will mit anklickbarem link zur Tasmota Webseite.
Wenn ich aber zweit Stati ausgeben will und davon einer schaltbar sein soll. Hab ich das gleiche Problem wie oben.

Übersehe ich hier noch etwas?

VG



TomLee

#10
Meinst du so (ohne das stateFormat):


{my $onl = ReadingsVal($name,"LWT","0") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";;
my $stat = ReadingsVal($name,"state","off");;
"<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage($onl)."</a>
<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($stat)."</a>"}


Gruß

Thomas

fervor

#11
Hallo Thomas,

gerade wenig Zeit, wollte mich aber zumindest noch schnell melden. Hab deinen Ansatz ausprobiert und das klappt super. Anderer Weg, gleiches Ziel. Noch ein bisschen tweaken und dann bin ich happy.

Also vielen Dank für die Unterstützung :-)

@Otto: Danke für deinen Support und deine Geduld

VG und einen guten Rutsch ins neue Jahr

PS:
hier noch meine finale Variante für interessierte
{my $online = ReadingsVal($name,"LWT","0") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";;
my $stat = ReadingsVal($name,"POWER1","off") eq "on"?"light_light_dim_100\@orange":"light_light_dim_00\@gray";;
"<a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($stat)."</a>
<a href=\"http://".ReadingsVal($name,"ip","none")." \"target=\"_blank\">".FW_makeImage($online)."</a>"}

Huabafranze

Hallo,
ich bin gerade auf diesen Beitrag gestoßen. Hier wird ganz genau das besprochen was ich machen möchte. Ich habe den letzten Code vom letzten Beitrag kopiert. Ich habe absolut keine Ahnung von Pearl. In dem Code habe ich lediglich "ip" gegen "IPAddress" ausgetauscht. jetzt funktioniert die Anzeige für On-/Offline; On/Off; und der Link auf die Gerätewebseite. Ob Update  Verfügbar (gelber Punkt) funktioniert weis ich nicht solange kein Update zur Verfügung steht. Jetzt hätte ich noch folgendes anliegen. Ich hätte gerne den On-/Offline -Punkt vor dem Icon und hätte gerne ein anderes Icon statt der Lampe. Würde das jemand einem Copy/Paste Anfänger erklären?

PS. gibts es auch einen reine FHEM Lösung, oder nur mit Pearl?

Otto123

Hi,

in #8 siehst Du auch eine FHEM Variante was Du willst geht sicher nur mit Perl siehe https://de.wikipedia.org/wiki/Perl_(Programmiersprache)
Du redest von Pearl https://de.wikipedia.org/wiki/Pearl

Das Icon kannst Du Dir erstmal interactiv mit dem Link extend DevstateIcon unter deinem Device auswählen. Den Rest musst Du dann im Code ändern.

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

Huabafranze

Hallo Otto,
danke für den Tip. Ja richtig, ich meine natürlich Perl  ;D
Ich habe jetzt einfach mal drauf los gebastelt und versucht den Perl-Code in logische Abschnitte aufzuspliten und dann anders aufzuteilen. Dann habe ich den Namen und die Farbe von dem Icon im Code mit dem ersetzt was ich gerne hätte. Ich bin total begeistert. Es hat tatsächlich funktioniert. So sieht es jetzt aus:

{my $online = ReadingsVal($name,"LWT","0") eq "Online"?"10px-kreis-gruen":"10px-kreis-rot";; my $stat = ReadingsVal($name,"POWER1","off") eq "on"?"sani_pump\@red":"sani_pump\@blue";; "<a href=\"http://".ReadingsVal($name,"IPAddress","none")." \"target=\"_blank\">".FW_makeImage($online). "</a> <a href=\"/fhem?cmd.dummy=set $name toggle&XHR=1\">".FW_makeImage($stat). "</a>"}

Jetzt weis ich nur nicht ob die Anzeige für das Update funktioniert. Kann man das testen ?
Bzw. sind die Angaben in dem Code richtig für das ganz normale Tasmota 8.1?
Muss ich etwas in der Tasmota Firmware einstellen (Konsole) damit ein neues Update in FHEM überhaupt registriert wird ?