FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: fervor am 26 Dezember 2019, 15:07:56

Titel: klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: fervor am 26 Dezember 2019, 15:07:56
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Otto123 am 26 Dezember 2019, 15:53:34
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: xenos1984 am 26 Dezember 2019, 18:21:06
@Otto123: Sollte da ans Ende vom devStateIcon noch ein schließendes "</div>"?
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Otto123 am 26 Dezember 2019, 18:35:45
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: fervor am 27 Dezember 2019, 00:47:17
@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:


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}
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Otto123 am 27 Dezember 2019, 19:00:02
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: fervor am 27 Dezember 2019, 22:24:32
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: TomLee am 27 Dezember 2019, 23:09:41
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Otto123 am 27 Dezember 2019, 23:30:17
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: fervor am 28 Dezember 2019, 15:47:14
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


Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: TomLee am 28 Dezember 2019, 17:26:34
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: fervor am 29 Dezember 2019, 23:41:53
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>"}
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Huabafranze am 20 März 2020, 19:36:42
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?
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Otto123 am 20 März 2020, 19:59:04
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
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: Huabafranze am 20 März 2020, 20:23:23
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 ?
Titel: Antw:klick auf Onlinestatus vom MQTT Device öffnet Webseite
Beitrag von: fervor am 21 März 2020, 19:18:20
Hallo Huabafranze,

der updatestatus wird in der finalen Variante von mir nicht angezeigt. Ich hatte daran kein Interesse, da ich nicht vor habe jedes update an jedem Device einzuspielen. Aber das ist natürlich Geschmackssache.

Noch ein kleiner Designtip: Ich habe das attr "cmdIcon" angepasst "on:30px_transparent off:30px_transparent " damit verschwinden dann die commands on und off. Sieht für meinen Geschmack besser aus.

Des weiteren noch eine Idee. Ich habe hier einen Steckdosenadapter, der auch ein paar USB-Ports hat. Diese sind natürlich auch schaltbar. Ich habs so gemacht, dass in einem Device sowohl die 220V, als auch die usb-Ports schaltbar sind. Dazu kann dann noch ein Timer aktiviert werden, d.h. 3 Schalter in einem Device. Fand ich ganz praktisch.

VG