Nextion-Display Anbindung über WiFi mit ESP8266

Hallo,

ich möchte hier noch mal das gesamte Projekt mit dem „Nextion-Display“ inklusive Beschreibung vorstellen.

Die ersten Teile der Beschreibung sind hier zu finden:

https://www.symcon.de/forum/threads/31868-Status-Display-(I2C)-über-Arduino?p=297992#post297992

Wenn jemand die Beschreibungen in besserer Quallität haben möchte der meldet sich einfach per PM.

Einrichtung in IPS:

Client Socket mit der IP-Adresse des Panels (ESP-Wlan-IP) und den Port anlegen.

Client_socket_display.jpg

Cutter anlegen mit Trennzeichen wie im Bild zu sehen (Übergeordnete Instanz -> Client Socket!)

Registervariable anlegen wie im Bild zu sehen (Übergeordnete Instanz -> Cutter!)

Struktur in IPS für das Display wie im Bild zu sehen anlegen

Es werden vier Scripte benötigt, wobei zwei optional sind und nicht unbedingt benötigt werden.

Empfangen Nextion Display 1 -> Hier werden die Empfangen Daten vom Panel ausgewertet und in die Variablen geschrieben (Button ID, Button Press_Release, Page ID). Im Beispiel werden „Touch event return Data“ und "Current page ID number returns
" benutzt. Sollten andere Events benötigt werden müssen diese nach der Nextion-Dokumentationen selber eingebunden werden!

<?
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($IPS_SENDER == "RegisterVariable")
{
  // bereits im Puffer der Instanz vorhandene Daten in $data kopieren
  $data  = RegVar_GetBuffer($_IPS['INSTANCE']);
  // neu empfangene Daten an $data anhängen
  $data .= $_IPS['VALUE'];

		if ((strtohex($data[0])=="65")) // Touch event return Data
	   {
                SetValue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/,strtohex($data[1]));    // Page
		SetValue(45558 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Button ID]*/,strtohex($data[2]));    // Button ID
                SetValue(39544 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Button Press_Release]*/,strtohex($data[3]));   	// Press or Release
    	}

		if ((strtohex($data[0])=="66")) // Current page ID number returns
	   {
	   SetValue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/,strtohex($data[1]));    // Page
    	}


  // Inhalt von $data im Puffer der RegisterVariable-Instanz speichern (Löschen !!!!)
   $data  = "";
  RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}


function strToHex($string)
{
    $hex='';
    for ($i=0; $i < strlen($string); $i++)
    {
        $hex .= dechex(ord($string[$i]));
    }
    return $hex;
}

?>

Senden Nextion Display 1 → Je nach Ereigniss (Variablenänderung) werden die Werte zum Display gesendet. Die Werte werden auch bei Aufbau der ersten Seite (Page ID = 1) gesendet!

<?

	$ID_Page= GetValue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/);
	   if ($ID_Page== 1)
	   {
	   $Temperatur_SW= GetValue(20029 /*[Haus 52A\Erdgeschoss\Bad\Sollwerte_Raum\Sollwert_zur_SPS]*/);
	   $Temperatur_IW= round(GetValue(18793 /*[Haus 52A\Erdgeschoss\Bad\Status_Raum\Temperatur\Value]*/),1);
	   $Feuchte_IW= round(GetValue(18714 /*[Haus 52A\Erdgeschoss\Bad\Status_Raum\Rel. Feuchte\Value]*/),1);
	   $Ventilstellung_IW= round(100.0 - GetValue(10585 /*[Haus 52A\Erdgeschoss\Bad\Status_Raum\Ventilöffnung\Value]*/));
		CSCK_SendText(57659 /*[Client Socket Nextion Display 1]*/, "Temperatur.t0.txt="."\x22".$Temperatur_SW."°C"."\x22"."\xFF\xFF\xFF");
		CSCK_SendText(57659 /*[Client Socket Nextion Display 1]*/, "Temperatur.t1.txt="."\x22".$Temperatur_IW."°C"."\x22"."\xFF\xFF\xFF");
		CSCK_SendText(57659 /*[Client Socket Nextion Display 1]*/, "Temperatur.t2.txt="."\x22".$Feuchte_IW." %"."\x22"."\xFF\xFF\xFF");
		CSCK_SendText(57659 /*[Client Socket Nextion Display 1]*/, "Temperatur.j0.val=".$Ventilstellung_IW."\xFF\xFF\xFF");
		}

?>

Optional:
Socket ON/OFF/Error Handler → Schaltet Client Socket Ein oder Aus je nach Verbindungsstatus. Das Script benötigt noch den „PING-status“ (Erreichbarkeit) vom Display.

<?
// Quellen: http://www.ip-symcon.de/forum/f18/socketverbindung-geschlossen-verfuegungsstehungs-statusabfrage-9348/
########################## Konfig ##############################################
$socket_id = 57659 /*[Client Socket Nextion Display 1]*/;
$Nextion_Ping_Status = getValueBoolean(11392 /*[Diagnose\Netzwerk\WatchDog_lan\NEXTION_Bad]*/);
$inst = IPS_GetInstance($socket_id/*[EG PetraPC Client Socket]*/);
$timer = 26163 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Sockethandler\Socket ON/OFF/Error Handler\]*/;
// Socket-Status: 102 offen, 104 geschlossen
########################## Konfig Ende #########################################


if(($inst['InstanceStatus'] != 102) && ($Nextion_Ping_Status == true)) // Fehlerbehandlung wenn CS Status = Fehler und Display = "Ein", Aktivierung 10sec-Timer
{
    //socket öffnen
    IPS_SetProperty($socket_id, "Open", true); //I/O Instanz soll aktiviert sein.
    IPS_ApplyChanges($socket_id);
    IPS_SetEventActive($timer, true);
    Setvalue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/,-1);
}
elseif (($inst['InstanceStatus'] == 102) && ($Nextion_Ping_Status == true))  // wenn Display = "Ein" und Clientsocket "OK" dann Timer deaktivieren
{
    //Timer deaktivieren
   IPS_SetEventActive($timer, false);
	Setvalue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/,-1);
	CSCK_SendText(57659 /*[Client Socket Nextion Display 1]*/, "page Temperatur"."\xFF\xFF\xFF");
}
elseif (($Nextion_Ping_Status == false) && ($inst['InstanceStatus'] != 104))// wenn Display = "Aus" und  Clientsocket Fehler
{
    //Socket schliessen
    IPS_SetProperty($socket_id, "Open", false); //I/O Instanz soll aktiviert sein.
    IPS_ApplyChanges($socket_id);
    IPS_SetEventActive($timer, true);
    Setvalue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/,-1);
}
else
{
    //Timer deaktivieren
   IPS_SetEventActive($timer, false);
}
// Status Client Socket
if($inst['InstanceStatus'] == 102)
{
setvalue(13003 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Sockethandler\Status Socket]*/, "Socket aktiv");
}
if($inst['InstanceStatus'] == 104)
{
setvalue(13003 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Sockethandler\Status Socket]*/, "Socket inaktiv");
}
if($inst['InstanceStatus'] >= 200)
{
setvalue(13003 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Sockethandler\Status Socket]*/, "Socket Fehlerhaft");
}
?>

Temperatur_SW_Plus_Minus → Reagiert auf Aktuallisierung von „Button ID“ und setzt den Sollwert für die Raumtemperatur je nach Tastendruck im Beispiel.

<?
$ID_Button= $_IPS['VALUE'];
$Press_Release= GetValue(39544 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Button Press_Release]*/);
$ID_Page= GetValue(59286 /*[Haus 52A\Erdgeschoss\Bad\Nextion Display\Page ID]*/);
$Temperatur_SW= GetValue(20029 /*[Haus 52A\Erdgeschoss\Bad\Sollwerte_Raum\Sollwert_zur_SPS]*/);

switch($ID_Button)
		{
			case 1:
			if (($Press_Release == 0) && ($ID_Page == 1))
			{
			SetValue(20029 /*[Haus 52A\Erdgeschoss\Bad\Sollwerte_Raum\Sollwert_zur_SPS]*/,$Temperatur_SW+0.5);
			}
			break;

			case 2:
			if (($Press_Release == 0) && ($ID_Page == 1))
			{
			SetValue(20029 /*[Haus 52A\Erdgeschoss\Bad\Sollwerte_Raum\Sollwert_zur_SPS]*/,$Temperatur_SW-0.5);
			}
			break;

			default:	return false;	break;
		}

?>

So ich hoffe nichts vergessen zu haben und wünsche viel Spaß beim Nachbasteln:D
Bei Fragen einfach her damit!

MfG Tommy

@Tommy, super gemacht, ich hatte auch was mit dem umprogrammierte IPS - LCD - Magicscript gemacht, allerdings mit RS232 Schnittstelle

Vielen Dank für die gut gemachte Beschreibung
Gruß Helmut

Gerne[emoji6] Ich hoffe das es nachvollziehbar und verständlich ist!

Hallo,

könnt ihr mir vielleicht weiterhelfen, ich möchte mein Nextion Display was direkt am Raspi per Serial GPIO von IP-Symcon eingesteckt ist auswerten wenn per Touch was gerückt wird. Aber das Empfangscript funktioniert bei mir leider nicht, und das ist auch alles zu hoch für mich. Könnt ihr mir vielleicht ein Tipp geben was ich falsch mache?

Zeig doch mal Deinen Config - Baum: Cutter, Ser Schnittstelle und mal mit und ohne Hex-Ansicht der Debug Fenster des ser Ports
Ev hilft es auch mal das HMI-File zu posten
Gruß Helmut

Gerne :slight_smile:

Nextion_DoorPi.zip (491 KB)

Ich würde in jeder Printzeile ein Trennzeichen einfügen, ich hatte ein Semikolon in meiner Anwendung genommen.

Damit den rechten Cutter füttern, das 3-malige Hex FF will er ja nur als Sendeabschluß von IP-Symcon haben, das Display selber schickt es nicht

Also so: print „54542121 ;“
und im Cutter rechts ; als nicht Hex-Wert eintragen, links nichts
Gruß Helmut

Ich hoffe Du hast es hin bekommen, wenn nicht, sende ich Dir gern mein HMI Beispiel, hier bei Youtubezu sehen.

Übrigens, es gibt von Böcker Systemtechnik ein sehr, sehr gutes Tutorial, guuggst Du:

Gruß Helmut

Hallo zusammen,

was mach ich hier falsch:

Kann es nur so abspeichern wie auf dem Bild. Auf der Anleitung sieht es anders aus.

Danke für Hilfe…

Meine Displaymeldungen an IP-Symcon sind reine Print Meldungen, ich nehme keine ID’s.

Deshalb ist meine Cuttereinstellung anders, ich werte ein Semikolon aus, zB meldet mein Display beim Touchfeld-loslassen über die ser Ausgabe

print „Eg Flur Licht;“

Und ich werte das Semikolon aus.
Gruß Helmut

Danke
Wie sieht deine Cutter Einstellung aus?

Gesendet von iPhone mit Tapatalk

Ganz einfach:
linker Cutter: nichts eintragen
rechter Cutter: Hex-Haken wegnehmen, Semikolon eingeben und speichern
Hier auch zusehen
Gruß Helmut

Edit: ein Auszug meines Auswerte Script, Du müsstest dann die Befehle der ser Schnittstelle nehmen, die Auswerte Strings anpassen und die ID’s anpassen. Schalt ID ist meine Schaltvariable, Display ID ist meine Client Instanc, bei seriellen Empfang von „Essz Licht“ wird die Variable getoogelt und der Zustand dem Display mitgeteilt.
Edit: Wenn Du ein ESP nimmst, kannst Du das Script so nehmen
Du mußt per ser. Befehle senden, also mit SPRT_SendText statt CSCK_SendText mit der seriellen Schnittstelle arbeiten

$SchaltID=40088 /[HMI Display\EG\Essz Leuchte]/;
$DisplayID=30032 /[HMI Display Client Socket]/;
if((getvalueString(21581 /[HMI Display\Auswertungen\HMI Text Empfang]/) == „Essz Licht“)) {

SetValueBoolean($SchaltID, !GetValueBoolean($SchaltID));
$Zustand = GetValueBoolean($SchaltID);
if ($Zustand == true) {
//echo „EIN“;
CSCK_SendText($DisplayID, „EG.b0.bco=65504“."\xFF\xFF\xFF"); //Sendet eine andere farbe für button 0
CSCK_SendText($DisplayID, „EG.b0.txt=„1"“.“\xFF\xFF\xFF" );
}
else

{
//echo „Aus“;
CSCK_SendText($DisplayID, „EG.b0.bco=50712“."\xFF\xFF\xFF"); //Sendet eine andere farbe für button 0
CSCK_SendText($DisplayID/[HMI Display Client Socket]/, „EG.b0.txt=„0"“.“\xFF\xFF\xFF" );
}
}

Bis jetzt kommen noch keine Daten :frowning:

über welches Modul kann ich Daten zurück schreiben?

Ich nutze kein Modul von IP-Symcon, meine Anwendung ging früher über die serielle Schnittstelle, jetzt mit Wemos als Client, der die seriellen Daten zum und vom Display übernimmt.

Eine Anleitung findest Du hier, und mein BeispielProjekt kannst Du da auch sehen
Gruß Helmut

möchte mein ESP nochmals ganz löschen.

Mit dem ESPlorer geht das nicht wirklich :frowning:

Das ESP verbindet sich immer als WLAN Client :frowning: obwohl ist eine neue BIN hochgeladen habe.

Verstehe das Prinzip noch nicht so ganz.

glg

Manuela

Dieses File für einen Wemos kann ich Dir anbieten, damit arbeite ich
Gruß Helmut

ESP_Tenet2Seriel_Test_Helmut - Kopie.zip (1.12 KB)

Hoi Helmut

Super mit deinem Prog kommt was an :slight_smile:

Leider nur zahlen und noch kein print im Klartext wie in deinem Beispiel…

Immerhin etwas…

Zahlen… weil Du im Debug noch Hex-Zeichen angewählt hast? klicke da mal drauf rum
Port 21 ?
Gruß Helmut
Hier mein Baum mit Cutter und Script angabe

Baum.jpg

Hey du bist gut…

Danke

Die Daten komme so zerstückelt:

K
K
unde;
Kunde;

(manchmal fehlt was)

Etwas mühsames habe ich noch…

Wenn ich den ESP neu starte muss ich die Client Socket deaktivieren/aktivieren im ips :frowning: sonst kommt nichts…

Versuche noch die LED auf dem Bord einzuschalten wenn WLAN ok ist. Für eine optische Kontrolle.

Ja, das habe ich auch, auch im laufendem Betrieb, dass er sich verabschiedet, ich pinge das Teil ständig an :wink:
Gibt sicher bessere Lösungen, aber es geht… $da ist meine Zustandsvariable, mache ich alle 15 Sek

  <?
$da=Sys_Ping("IP ADR",20); //
echo $da;
?>