Nextion - günstiges Touch-Display an FHEM (auch remote)

Begonnen von viegener, 24 März 2016, 00:06:06

Vorheriges Thema - Nächstes Thema

viegener

Zitat von: andies am 18 März 2019, 06:37:49
Hmm, komisch. Ich bilde mir ein, genau das getestet zu haben (kann aber auch sein, dass ich da wieder mal was falsch gemacht habe) und in der Commandref habe ich kein "echtes" Perl-Beispiel gefunden; SetMagic ging, aber eben reiner Code.

Wenn das geht, braucht man keinen "Patch", klar. Kann mal jemand mit dem Original prüfen, ob ich da Mist gebaut habe?

Die set magic ist zentral in FHEM implementiert. Wenn der eine Teil geht, muss der andere auch funktionieren, denn das ist gar nicht im Nextionmodul implementiert. Das Problem ist meistens in der Ausgestaltung der Klammern, hier ist es nicht immer konsistent in allen Modulen. Bei set magic ist aussen geschweift, innen dann runde Klammer {(   ... )}, sonst wird es nicht als Perl erkannt.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

Habe meine Vorschlag durchgestrichen. Vermutlich habe ich die innere Klammer vergessen.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Zitat von: viegener am 18 März 2019, 10:18:43
Die set magic ist zentral in FHEM implementiert. Wenn der eine Teil geht, muss der andere auch funktionieren, denn das ist gar nicht im Nextionmodul implementiert.
Sorry Johannes, ich muss nochmal nerven. Es geht nicht bei mir. Also, ich habe folgendes in Nextion eingerichtet
Internals:
   Clients    :NEXTION:
   DEF        192.168.2.32:23@115200
   DeviceName 192.168.2.32:23@115200
   FD         18
   FUUID      5c782b5a-f33f-1115-3b26-2fabc4c559c5e42c
   NAME       Nextion
   NR         224
   NTFY_ORDER 50-Nextion
   PARTIAL   
   STATE      opened
   TYPE       Nextion
   Helper:
     DBLOG:
       cmdSent:
         DbLog:
           TIME       1552932857.48306
           VALUE      Temperatur0.txt="22.6°C (24.7°C)";t2.txt="stark bewölkt";t9.txt="15%";t6.txt="6°C";t3.txt="stark bewölkt";t10.txt="15%";t7.txt="8°C";t5.txt="Regenschauer";t11.txt="40%";t8.txt="8°C";t0.txt="9 Uhr";t1.txt="12 Uhr";t4.txt="15 Uhr";t2.font=0;t3.font=0;t5.font=0;p1.pic=5;p0.pic=5;p2.pic=7;
   MatchList:
     1:NEXTION  .*
   READINGS:
     2019-03-18 19:14:17   cmdResult       empty
     2019-03-18 19:14:17   cmdSent         Temperatur0.txt="22.6°C (24.7°C)";t2.txt="stark bewölkt";t9.txt="15%";t6.txt="6°C";t3.txt="stark bewölkt";t10.txt="15%";t7.txt="8°C";t5.txt="Regenschauer";t11.txt="40%";t8.txt="8°C";t0.txt="9 Uhr";t1.txt="12 Uhr";t4.txt="15 Uhr";t2.font=0;t3.font=0;t5.font=0;p1.pic=5;p0.pic=5;p2.pic=7;
     2019-03-18 19:14:17   currentPage     0
     2019-03-18 19:14:17   old1            H01
     2019-03-18 19:14:17   old2            H65(e) H01 H01 H01
     2019-03-18 19:14:16   old3            H01
     2019-03-18 19:14:16   old4            H01
     2019-03-18 19:14:16   old5            H01
     2019-03-18 19:14:17   received        H66(f) H00
     2019-03-18 19:14:17   rectext         page 0
     2019-03-18 12:04:58   state           opened
Attributes:
   group      Nextion
   hasSendMe  1
   initPage0  {(NextionAktualisieren())}
   initPage1  t1.txt="Bad unten: [BadUntenfenster:state]"; t2.txt="Bad oben: [Badezimmerfenster:state]"; t3.txt="Schlafzmr.: [Schlafzimmerfenster:state]"
   verbose    2

und der Befehl ist so definiert
sub NextionAktualisieren() {

#Wetterbeschreibung setzen
my $Nextion_cmd = "Temperatur0.txt=\"".ReadingsVal("BresserTemeo_1", "temperature", "")."°C (".ReadingsVal("BresserTemeo_1","temperature_at", "")."°C)\";";
$Nextion_cmd .= "t2.txt=\"".ReadingsVal("MeinWetter", "fc0_weather09", "")."\";";
$Nextion_cmd .= "t9.txt=\"".ReadingsVal("MeinWetter", "fc0_chOfRain09", "")."\%\";";
$Nextion_cmd .= "t6.txt=\"".ReadingsVal("MeinWetter", "fc0_temp09", "")."°C\";";
$Nextion_cmd .= "t3.txt=\"".ReadingsVal("MeinWetter", "fc0_weather12", "")."\";";
$Nextion_cmd .= "t10.txt=\"".ReadingsVal("MeinWetter", "fc0_chOfRain12", "")."\%\";";
$Nextion_cmd .= "t7.txt=\"".ReadingsVal("MeinWetter", "fc0_temp12", "")."°C\";";
$Nextion_cmd .= "t5.txt=\"".ReadingsVal("MeinWetter", "fc0_weather15", "")."\";";
$Nextion_cmd .= "t11.txt=\"".ReadingsVal("MeinWetter", "fc0_chOfRain15", "")."\%\";";
$Nextion_cmd .= "t8.txt=\"".ReadingsVal("MeinWetter", "fc0_temp15", "")."°C\";";

#Beschreibungen korrigierem
$Nextion_cmd .= "t0.txt=\"9 Uhr\";";
$Nextion_cmd .= "t1.txt=\"12 Uhr\";";
$Nextion_cmd .= "t4.txt=\"15 Uhr\";";

#Fondsgroessen setzen
my $Nextion_font = (length(ReadingsVal("MeinWetter", "fc0_weather09", ""))>8) ? "0" : "1";
$Nextion_cmd .= "t2.font=".$Nextion_font.";";
$Nextion_font = (length(ReadingsVal("MeinWetter", "fc0_weather12", ""))>8) ? "0" : "1";
$Nextion_cmd .= "t3.font=".$Nextion_font.";";
$Nextion_font = (length(ReadingsVal("MeinWetter", "fc0_weather15", ""))>8) ? "0" : "1";
$Nextion_cmd .= "t5.font=".$Nextion_font.";";

#Abbildungen setzen
#typischer Pfad https://www.proplanta.de/wetterdaten/images/symbole/n3.gif
my $Wetter_Icon_Path = ReadingsVal("MeinWetter","fc0_weather09Icon", "");
$Wetter_Icon_Path  =~ /https:\/\/www.proplanta.de\/wetterdaten\/images\/symbole\/[nt](\d+).gif/;  #
my $Wetter_Icon_Id = $1+1;     
$Nextion_cmd .= "p1.pic=".$Wetter_Icon_Id.";";

$Wetter_Icon_Path = ReadingsVal("MeinWetter","fc0_weather12Icon", "");
$Wetter_Icon_Path  =~ /https:\/\/www.proplanta.de\/wetterdaten\/images\/symbole\/[nt](\d+).gif/;  #
$Wetter_Icon_Id = $1+1;     
$Nextion_cmd .= "p0.pic=".$Wetter_Icon_Id.";";

$Wetter_Icon_Path = ReadingsVal("MeinWetter","fc0_weather15Icon", "");
$Wetter_Icon_Path  =~ /https:\/\/www.proplanta.de\/wetterdaten\/images\/symbole\/[nt](\d+).gif/;  #
$Wetter_Icon_Id = $1+1;     
$Nextion_cmd .= "p2.pic=".$Wetter_Icon_Id.";";

return $Nextion_cmd;
}
 

und dennoch sehe ich auf dem Nextion keinerlei Einträge. Als ich das dagegen mit meinem "Patch" gemacht habe, war das sichtbar. Was kann da los sein?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

#588
Ich muss das eingrenzen. Das hier geht
defmod Nextion_aktualisieren at +*00:20:00 {fhem("set Nextion pageCmd 0 \{(NextionAktualisieren())\}")}

und das hier nicht
defmod Nextion Nextion 192.168.2.32:23@115200
attr Nextion initPage0 {(NextionAktualisieren())}

und hier noch der log des zweiten Befehls

2019.03.18 20:58:22 4: Nextion: Received message :H65(e) H01 H01 H01:
2019.03.18 20:58:22 4: Nextion: Received message :H01:
2019.03.18 20:58:22 4: Nextion: Received message :H66(f) H00:
2019.03.18 20:58:22 4: Nextion_InitPage Nextion: page  :0: with commands :{(NextionAktualisieren())}:
2019.03.18 20:58:22 4: Nextion_SendCommand Nextion: send commands :{(NextionAktualisieren())}:
2019.03.18 20:58:22 4: Nextion: Nextion_SendCommand ReplaceSetmagic commnds after :Temperatur0.txt="4.2°C (2.0°C)";t2.txt="stark bewölkt";t9.txt="15%";t6.txt="6°C";t3.txt="stark bewölkt";t10.txt="15%";t7.txt="8°C";t5.txt="Regenschauer";t11.txt="40%";t8.txt="8°C";t0.txt="9 Uhr";t1.txt="12 Uhr";t4.txt="15 Uhr";t2.font=0;t3.font=0;t5.font=0;p1.pic=5;p0.pic=5;p2.pic=7;:
2019.03.18 20:58:22 4: Nextion_SendCommand Nextion: send command :Temperatur0.txt="4.2°C (2.0°C)";t2.txt="stark bewölkt";t9.txt="15%";t6.txt="6°C";t3.txt="stark bewölkt";t10.txt="15%";t7.txt="8°C";t5.txt="Regenschauer";t11.txt="40%";t8.txt="8°C";t0.txt="9 Uhr";t1.txt="12 Uhr";t4.txt="15 Uhr";t2.font=0;t3.font=0;t5.font=0;p1.pic=5;p0.pic=5;p2.pic=7;:
2019.03.18 20:58:22 4: Nextion_SendCommand Success


<edit>ich glaube, das Problem liegt hier

  # Split commands into separate elements at single semicolons (escape double ;; before)
  $msg =~ s/;;/SeMiCoLoN/g;
  my @msgList = split(";", $msg);
  my $singleMsg;
  while(defined($singleMsg = shift @msgList)) {
    $singleMsg =~ s/SeMiCoLoN/;/g;

    my ($err, @a) = ReplaceSetMagic($hash, 0, ( $singleMsg ) );
    if ( $err ) {
      Log3 $name, 1, "$name: Nextion_SendCommand failed on ReplaceSetmagic with :$err: on commands :$singleMsg:";
    } else {
      $singleMsg = join(" ", @a);
      Log3 $name, 4, "$name: Nextion_SendCommand ReplaceSetmagic commnds after :".$singleMsg.":";
    }   
   
    my $lret = Nextion_SendSingleCommand($hash, $singleMsg, $answer);
    push(@ret, $lret) if(defined($lret));
  }

  return join("\n", @ret) if(@ret);
  return undef;
}

Da wird zuerst gesplittet und setmagic angewandt. In meinem Fall müsste es genau anders herum sein.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

viegener

@andies: Du hast Recht, in den initPage-Funktionen lassen sich nicht mehrere Kommandos aus einem Perl-Befehlen erzeugen.

Jetzt gibt es nur das Problem, dass ich inzwischen Nextion so weiterentwickelt habe, dass es auch auf Änderungen von anderen Devices reagieren kann, so dass man sich viele notifies sparen kann. Damit ist aber das von Dir gewünscht Konstrukt nicht mehr möglich.
Diese Version findet sich in github, ich habe Sie aber nicht per SVN verfügbar machen können, da sie nicht ausreichend getestet wurde.

Um das Verhalten zu erreichen, dass Du willst ist es aber natürlich möglich ein notify auf die Seite zu definieren, in dem Du Deine Perl-funktion aufrufst. Damit sollte das auch direkt machbar sein (also kein at sondern ein notify).

Hilft das?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

du meinst: sobald ich seite 0 aufrufe, wird ein notify ausgelöst und das aktualisiert die Seite? ja, das kann ich so schreiben (ich hatte das, glaube ich, schon mal und da gab es probleme, weil das notify manchmal nicht getriggert wurde). Versuche ich mal.

wäre es auch möglich, dass man prüft, ob die beiden ersten Zeichen {( sind und man dann bei page-Kommandos setmagic vor der Zerlegung anwendet? Oder bringt das mehr Sachen durcheinander?


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

viegener

Zitat von: andies am 18 März 2019, 21:53:57
du meinst: sobald ich seite 0 aufrufe, wird ein notify ausgelöst und das aktualisiert die Seite? ja, das kann ich so schreiben (ich hatte das, glaube ich, schon mal und da gab es probleme, weil das notify manchmal nicht getriggert wurde). Versuche ich mal.

wäre es auch möglich, dass man prüft, ob die beiden ersten Zeichen {( sind und man dann bei page-Kommandos setmagic vor der Zerlegung anwendet? Oder bringt das mehr Sachen durcheinander?


Gesendet von iPad mit Tapatalk Pro

Leider nicht. Das Problem ist, dass die initPage Commands ja auch einen Perl-Ausdruck am Anfang haben können, ausserdem würde es das Problem nur für Dich lösen wenn Du nur eine einzige Funktion in initPage hast, die verschiedene Nextion-Kommandos auslösen soll.

Wenn ein notify auf die aktuelle Seite nicht korrekt funktioniert, müsste man da mal genauer recinschauen, aber eigentlich sollte ein notify ziemlich stabil sein.
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

klappt:

defmod Nextion_notify_page0 notify Nextion:received:.H66\(f\).H00 set Nextion pageCmd 0 {(NextionAktualisieren())}


Danke!


Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Ich hatte sporadische Ausfälle am Nextion (und anderswo, ,,disconnected" ohne erkennbaren Grund) und so habe ich zwei Dinge getan:

  • Mir einen Unifi AP angeschafft und
  • einen neuen Wemos besorgt und mit ESPEasy geflasht.
Das Gerät steht jetzt testweise vier Meter neben dem AP und ist ständig disconnected. Hat jemand eine Idee, was ich jetzt probieren kann? Da ist doch der Wurm drin...
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

viegener

Zitat von: andies am 30 April 2019, 06:41:00
Ich hatte sporadische Ausfälle am Nextion (und anderswo, ,,disconnected" ohne erkennbaren Grund) und so habe ich zwei Dinge getan:

  • Mir einen Unifi AP angeschafft und
  • einen neuen Wemos besorgt und mit ESPEasy geflasht.
Das Gerät steht jetzt testweise vier Meter neben dem AP und ist ständig disconnected. Hat jemand eine Idee, was ich jetzt probieren kann? Da ist doch der Wurm drin...

Ich bin mir nicht sicher, was "ständig disconnected" bedeutet, aber ich vermute mal dass es immer mal wieder disconnected ?
Ich hatte das Problem in der Vergangenheit auch mit einigen ESPs, deshalb habe ich damals  in FHEM einen regelmässigen Befehl an das Display oder entsprechend sogar ein reopen auf dem Device abgesetzt.

Also alle 2-3 min wenn das page reading ein gewisses Alter hat, dann springe ich zu page 0 und wenn es älter als z.B: 6 Minuten ist - wird ein reopen ausgeführt, da offensichtlich keine Reaktion erfolgt ist.

Hiermal alter Beispielcode (Perl gehört also z.B. in myutils), den ich ausgeführt habe als Teil eines regelmässigen at.


sub handle_keepalive_nextion($)
{
  my ($name) = @_;

  my $resp;
 
  if ( ReadingsAge($name,"currentPage","0") > 360 ) {
    Log3( $name , 3, "Keepalive on $name --> reopen");
    $resp = fhem("set $name reopen");
  } elsif ( ReadingsAge($name,"currentPage","0") > 180 ) {
    Log3( $name , 4, "Keepalive on $name --> set page 0");
    # silent
    $resp = fhem("set $name page 0", 1);
  }

}


Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

Ja, immer mal disconnected. Das meine ich. Diesen ständigen Zugriff habe ich schon, nützt aber nichts:
Internals:
   COMMAND    {fhem("set Nextion pageCmd 0 \{(NextionAktualisieren())\}")}
   DEF        +*00:03:00 {fhem("set Nextion pageCmd 0 \{(NextionAktualisieren())\}")}
   FUUID      5c8d314d-f33f-1115-9690-ca8dbfed96e36bba
   NAME       Nextion_aktualisieren
   NR         232
   NTM        13:49:59
   PERIODIC   yes
   RELATIVE   yes
   REP        -1
   STATE      Next: 13:49:59
   TIMESPEC   00:03:00
   TRIGGERTIME 1556624999.59608
   TRIGGERTIME_FMT 2019-04-30 13:49:59
   TYPE       at
   READINGS:
     2019-04-30 13:46:59   state           Next: 13:49:59
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

viegener

Zitat von: andies am 30 April 2019, 13:48:23
Ja, immer mal disconnected. Das meine ich. Diesen ständigen Zugriff habe ich schon, nützt aber nichts:

Nein, zumindest, wenn in NextionAktualisieren nicht auch den reopen enthält, dann setzt Du nur das Nextion auf Page 0.

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

OK, danke. Ich habe jetzt
defmod Nextion_prevent_sleep DOIF (([Nextion:state] eq "disconnected") and [+00:04]) (set Nextion reopen;;)

eingerichtet. Das sollte was bringen? Ich probiere mal.
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

andies

Ha, jetzt habe ich was:
90091878: WD : Uptime 1501 ConnectFailures 0 FreeMem 16664
90157901: Ser2N: network buffer full!
90158001: Ser2N: network buffer full!

Das steht im Log des ESP-Easy! Nur was mache ich jetzt?
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

viegener

Zitat von: andies am 30 April 2019, 21:22:34
Ha, jetzt habe ich was:
90091878: WD : Uptime 1501 ConnectFailures 0 FreeMem 16664
90157901: Ser2N: network buffer full!
90158001: Ser2N: network buffer full!

Das steht im Log des ESP-Easy! Nur was mache ich jetzt?

Nach meiner Interpretation heisst das einfach, dass über das Netzwerk mehr Daten reinkommen, als über die serielle Schnittstelle an das Display transferiert werden kann (Der puffer ist in ESPEasy wohl auf 128 Zeichen beschränkt).

Also zwei Möglichkeiten
- Transfer von Daten zum Nextion verbessern (kürzere Texte/Daten oder höhere Baudrate beim seriellen Transfer (Was verwendest Du dort?)
- Transfer auf FHEM-Seite verlangsamen - eingestreute Pausen beim Versenden


-
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können