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.
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