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

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

Vorheriges Thema - Nächstes Thema

UweH

Zitat von: yamfhem am 21 Januar 2018, 00:25:19
Weiß hier jemand, wieso im Nextion Editor ein neu angelegter Hotspot nicht transparent ist?
So in etwa?
Scheinbar eine etwas inkonsequente Umsetzung der Programmierung. Über einer eingebetteten Grafik ist er transparent.
In diesem Beispiel sind die weißen Umrandungen der Buttons auf der Hintergrundgrafik, die eigentlichen DualState-Buttons werden vom Hotspot überdeckt.


Gruß
Uwe

viegener

Zitat von: ext23 am 20 Januar 2018, 18:52:39
Nabend,

man das ist ja ein Krampf mit einem Plus und Minus Button die Temperatur in 0,5er Schritte einzustellen, aber jetzt gehts.

Mal ne andere Frage, wieso wird bei einem Rückgabewert "val" das 0x71 (q) rausgefiltert und bei einem Rückgabewert "txt" das 0x70 (p) nicht?

Und wie kann ich denn bei dem init ein Wert mit 10 Multiplizieren bevor ich ihn zum Display sende? So funktioniert es nicht.
Heizung.solltemp.val=([wz_Thermostat:desired-temp]*10);

/Daniel

Das geht durch Umweg über perl, Berechnungen gehen wie bei set-Befehlen (Set-logik:
https://fhem.de/commandref_DE.html#set

Heizung.solltemp.val={( ReadingsVal("wz_Thermostat","desired-temp",0)]*10)};
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

Zitat von: UweH am 20 Januar 2018, 18:07:08
Hallo viegener,

da auf meiner Testumgebung mit der neuen Nextion.pm alles reibungslos lief, habe ich heute mal ein Display meines Live-Systems auf die neue Nextion.pm umgestellt und siehe da, Probleme. Ich komme der Sache mit meinen Fähigkeiten nicht auf die Spur, vielleicht kannst Du Dir einen Reim drauf machen.

Einen Status einlesen in dieser Art hier (in der initPage):
[Aktor1.A:.*(ON|OFF)] (button.val={(return ( ( ReadingsVal("Aktor1","A","OFF") eq "ON" )?1:0) )};button.pco={(return ( ( ReadingsVal("Aktor1","A","OFF") eq "ON" )?64512:2016) )})
läuft auf meinem Test-System problemlos. Das Display ist per USB angestöpselt. Auf der anderen Umgebung jedoch funktioniert der Code nicht. Dort ist das Display per LAN angebunden. Um Fehler zu eliminieren, habe ich hin- und hergetauscht. Also auch vom Testrechner aus per LAN zugegriffen, funktioniert. Das Ergebnis stundenlangen testen ist, dass eben diese Funktion nicht auf meinem schnelleren Live-System funktioniert, unabhängig von der Art der Ansteuerung. Ich habe es dann auch mit allen anderen Displays ausprobiert, gleiches Ergebnis. Läuft auf Test-Raspi, nicht auf Live. Ich könnte nun auch noch mein komplettes System auf den Raspi umziehen, um auch das noch zu testen, aber da schrecke ich noch etwas zurück...

Übrigens ist das Schalten von Aktoren etc. aus recPage-Funktion heraus überall problemlos möglich.
Kann ich noch andere Daten liefern, um die Sache einzugrenzen?


Ich glaube nicht, dass es an "schnellerem" System oder ähnlichem liegt. Die neue Version ist auch da installiert? Dieselbe wie auf dem Testsystem oder eine andere?

Was hilfrecih wäre - was heisst funktioniert nicht? Geht keiner oder nur der einzelne Ausdruck nicht
Was sagt der eventmonitor wenn Du schaltest, kannst Du den Event mal posten?

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

UweH

#498
Zitat von: viegener am 21 Januar 2018, 10:25:28
Was hilfrecih wäre - was heisst funktioniert nicht? Geht keiner oder nur der einzelne Ausdruck nicht
Was sagt der eventmonitor wenn Du schaltest, kannst Du den Event mal posten?
Auf beiden Systemen hat FHEM den gleichen Stand, die Nextion.pm ist identisch.

Mal ein aktuelles Beispiel. Das Schalten des Aktors erzeugt im Eventmonitor diesen Eintrag:
11:06:51 OWSWITCH Aktor_AZ output Treppe on

Darauf soll dieser Ausdruck in initPage3 reagieren:
[Aktor_AZ.Treppe:.*(ON|OFF)] (ledleiste.val={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?1:0) )};
ledleiste.pco={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?64512:65504) )})

Also Status auf 1 setzen und Schriftfarbe des Buttons "ledleiste" ändern. Funktioniert nicht im Live-System, aber auf der Testumgebung.

Auch mit dieser Variante nicht:
[Aktor_AZ.Treppe:ON.*] (ledleiste.pco=64512) [Aktor_AZ.Treppe:OFF.*] (ledleiste.pco=65504)

Mit der bisherigen Variante:
ledleiste.val={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?1:0) )};
ledleiste.pco={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?64512:65504) )};

funktioniert es auf beiden Systemen.

Das Schalten dieses Aktors aus recPage3 heraus mit diesem Ausdruck funktioniert auch auf beiden Systemen.
[\$ledleiste=(1|0)] (set Aktor_AZ output Treppe {( return (('$EVENT' =~ /=1$/)?"on":"off") )})

Ich habe sogar auf beiden Systemen den Aktoren und Displayobjekten die gleichen Namen gegeben, um Fehler auszuschließen.

Was kann ich sonst noch liefern?

Gruß
Uwe

EDIT: Übrigens vielleicht nicht ganz unwichtig, die OFF und ON werden in dem Fall tatsächlich groß geschrieben:

   READINGS:
     2017-12-25 15:00:33   A               OFF
     2018-01-21 13:19:47   B               OFF
     2018-01-21 13:19:47   Treppe          OFF
     2018-01-21 13:19:47   gpio            3
     2018-01-21 13:19:47   state           Treppe: OFF B: OFF




yamfhem

..., gerade nochmal probiert - bei mir ist touch m1 immer vollfarbig gefüllt!?
Gruß Rene


Zitat von: UweH am 21 Januar 2018, 09:57:50
So in etwa?
Scheinbar eine etwas inkonsequente Umsetzung der Programmierung. Über einer eingebetteten Grafik ist er transparent.
In diesem Beispiel sind die weißen Umrandungen der Buttons auf der Hintergrundgrafik, die eigentlichen DualState-Buttons werden vom Hotspot überdeckt.



Gruß
Uwe

yamfhem

.... ah, ich habs! Das "eingebettet" ist das entscheidende Merkmal. Ich hatte auf der Seite einfach ein Image eingefügt und dann darüber den Hotspot gelegt => geht nicht.
Wenn man aber die Page -> sta -> image mit einem Bild verknüpft, dann funtzt das!

Danke und Gruß
Rene

viegener

Zitat von: UweH am 21 Januar 2018, 11:56:09
Auf beiden Systemen hat FHEM den gleichen Stand, die Nextion.pm ist identisch.

Mal ein aktuelles Beispiel. Das Schalten des Aktors erzeugt im Eventmonitor diesen Eintrag:
11:06:51 OWSWITCH Aktor_AZ output Treppe on

Darauf soll dieser Ausdruck in initPage3 reagieren:
[Aktor_AZ.Treppe:.*(ON|OFF)] (ledleiste.val={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?1:0) )};
ledleiste.pco={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?64512:65504) )})

Also Status auf 1 setzen und Schriftfarbe des Buttons "ledleiste" ändern. Funktioniert nicht im Live-System, aber auf der Testumgebung.

Auch mit dieser Variante nicht:
[Aktor_AZ.Treppe:ON.*] (ledleiste.pco=64512) [Aktor_AZ.Treppe:OFF.*] (ledleiste.pco=65504)

Mit der bisherigen Variante:
ledleiste.val={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?1:0) )};
ledleiste.pco={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?64512:65504) )};

funktioniert es auf beiden Systemen.

Das Schalten dieses Aktors aus recPage3 heraus mit diesem Ausdruck funktioniert auch auf beiden Systemen.
[\$ledleiste=(1|0)] (set Aktor_AZ output Treppe {( return (('$EVENT' =~ /=1$/)?"on":"off") )})

Ich habe sogar auf beiden Systemen den Aktoren und Displayobjekten die gleichen Namen gegeben, um Fehler auszuschließen.

Was kann ich sonst noch liefern?

Gruß
Uwe

EDIT: Übrigens vielleicht nicht ganz unwichtig, die OFF und ON werden in dem Fall tatsächlich groß geschrieben:

   READINGS:
     2017-12-25 15:00:33   A               OFF
     2018-01-21 13:19:47   B               OFF
     2018-01-21 13:19:47   Treppe          OFF
     2018-01-21 13:19:47   gpio            3
     2018-01-21 13:19:47   state           Treppe: OFF B: OFF



Nein es wird nicht gross geschrieben -> siehe Event

Grundsätzlich: Es geht nicht um ein Reading sondern um den Event - genauso wie bei Notify etc

Und damit nochmal zum mitschreiben:

Der Event lautet laut Deiner Info:

11:06:51 OWSWITCH Aktor_AZ output Treppe on

Fehlt da das Datum? Naja seis drum

Dann muss dein regexp auf folgenden Teil matchen:

Aktor_AZ output Treppe on

Und da ist
- on nunmal nicht gross
- Treppe steht in der Mitte weil es nachher in diesem Reading landet
- von A / B steht da gar nichts

Also eigentlich sollte so etwas gehen:

[Aktor_AZ.*Treppe.*(on|off)]






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

UweH

Zitat von: viegener am 21 Januar 2018, 14:29:24
Fehlt da das Datum? Naja seis drum
Beim kopieren verlorengegangen.

Den Rest kann ich nicht bestätigen. Mit der Groß/Klein-Geschichte und den Readings eines 1-Wire-Aktors könnte Dir sicher pah was sagen. Um das zu begründen, fehlt mir die Sachkenntnis. Mit einem einfachen Dummy funktioniert's ja auch nicht.
Fakt ist, dass der Ausdruck in genau dieser Form:
[Aktor_AZ.Treppe:.*(ON|OFF)] (ledleiste.val={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?1:0) )};
ledleiste.pco={(return ( ( ReadingsVal("Aktor_AZ","Treppe","OFF") eq "ON" )?64512:65504) )})

nur auf einem meiner beiden Systeme funktioniert.

Zitat von: viegener am 21 Januar 2018, 14:29:24
Also eigentlich sollte so etwas gehen:

[Aktor_AZ.*Treppe.*(on|off)]
Nein, auch nicht.
Ich kann Dir notfalls ein Video machen, um zu zeigen, dass es so:
[Aktor_AZ.Treppe:.*(ON|OFF)]
funktioniert. Aber eben nur in einer Umgebung.
Das liegt jetzt alles ganz sicher nicht an der Nextion.pm (läuft ja auf der einen Maschine), aber irgendworan hakt es.

Gruß
Uwe

UweH

Damit wird das vielleicht deutlicher. Ein 2-Kanal 1-Wire-Schaltaktor hat die Kanalnamen A und B, die man auch umbennen kann, in meinem Fall heißt Kanal A nun Treppe.
Geschaltet wird der Aktor mit dem Befehl
set Aktor_AZ output Treppe on

So sieht die Definition aus:
defmod Aktor_AZ OWSWITCH DS2413 xxx
attr Aktor_AZ AName Treppe
attr Aktor_AZ IODev 1wire_USB_2
attr Aktor_AZ model DS2413
attr Aktor_AZ room OWX

setstate Aktor_AZ Treppe: OFF B: OFF
setstate Aktor_AZ 2017-12-25 15:00:33 A OFF
setstate Aktor_AZ 2018-01-21 15:57:29 B OFF
setstate Aktor_AZ 2018-01-21 15:57:29 Treppe OFF
setstate Aktor_AZ 2018-01-21 15:57:29 gpio 3
setstate Aktor_AZ 2018-01-21 15:57:29 state Treppe: OFF B: OFF


Und so die Rückmeldung des Aktors im Event-Monitor:
2018-01-21 16:06:08 OWSWITCH Aktor_AZ Treppe: ON
2018-01-21 16:06:08 OWSWITCH Aktor_AZ B: OFF
2018-01-21 16:06:08 OWSWITCH Aktor_AZ Treppe: ON B: OFF

viegener

@UweH: Es bleibt dabei, dass eine Reaktion auf den Event-Inhalt und nicht auf Readingwerte erfolgt. Je nach Einstellungen oder auch Modul kann der Readingwert davon abweichen. Die Reihenfolge ist Device, Reading (oder leer), Wert(e).

Argh - jetzt sehe ich Deine Antwort - Du hast also einen ganz anderen Event gepostet - Das war nicht sehr hilfreich

Und zu Deinem Event lautet der Wert eben nicht "ON", sondern "Treppe on" (Woher der Wert musst Du Dir nicht sagen). Das Reading ist vermutlich eher "output". Es passt also gar nicht zu Deiner Bedingung.

Also ich mache nochmal einen Versuch Dir zu helfen, denn es ist schon etwas schwierig mit abgeschnittenen und unvollständigen Angaben:

- Mach mal ein list (komplett nicht Deine Auschnitte) von dem Aktor - Keine Definition sondern das Kommando list
- Setze den Regexp mal auf
Aktor_AZ.*Treppe.*ON
- Wenn der Aktor schaltet - mach mal einen Mitschnitt im Eventmonitor auf dem System - nicht abgeschnitten und nicht nur ein Event, sondern alles was zu der Zeit passiert)
- Setze das Nextion mal auf verbose 4, wenn der regexp oben aktiv ist und poste das log mal (Hintergrund: Ich vermute der Ausdruck passt, aber der Readingsval passt nicht, denn wie gesagt das Reading ist ja NICHT Treppe bei dem Event)




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

UweH

Zitat von: viegener am 21 Januar 2018, 16:19:40
- Setze den Regexp mal auf
Aktor_AZ.*Treppe.*ON
Damit funktioniert es.
Danke für Deine Mühe.


Damit übrigens auch:
[Aktor_AZ.*Treppe.*ON|OFF]

Trotzdem verstehe ich nun immer noch nicht, warum der obige Ausdruck auf beiden Systemen funktioniert und der hier:
[Aktor_AZ.Treppe:.*(ON|OFF)]
nur auf einem. Aber egal, zu den Akten.

Der Vollständigkeit halber den Rest auch noch, aber nun sicher eher unwichtig.

List vom Aktor:
Internals:
   ASYNC      0
   CFGFN     
   DEF        DS2413 CF840C000000
   ERRCOUNT   0
   INTERVAL   300
   IODev      1wire_USB_2
   NAME       Aktor_AZ
   NEXTSEND   1516550957.05433
   NOTIFYDEV  global
   NR         447
   NTFY_ORDER 50-Aktor_AZ
   OW_FAMILY  3A
   OW_ID      CF840C000000
   PRESENT    1
   ROM_ID     3A.CF840C000000.E2
   STATE      Treppe: OFF B: OFF
   TYPE       OWSWITCH
   READINGS:
     2017-12-25 15:00:33   A               OFF
     2018-01-21 17:09:17   B               OFF
     2018-01-21 17:09:17   Treppe          OFF
     2018-01-21 17:09:17   gpio            3
     2018-01-21 17:09:17   state           Treppe: OFF B: OFF
   owg_val:
     1
     1
   owg_vax:
     1
     1
Attributes:
   AName      Treppe
   IODev      1wire_USB_2
   model      DS2413
   room       OWX


Eventmonitor:
2018-01-21 17:13:05 OWSWITCH Aktor_AZ output Treppe on
2018-01-21 17:13:07 Nextion NXT_DI_AZ cmdSent: ledleiste.val=1
2018-01-21 17:13:07 Nextion NXT_DI_AZ cmdResult: empty
2018-01-21 17:13:07 Nextion NXT_DI_AZ cmdSent: ledleiste.pco=64512
2018-01-21 17:13:07 Nextion NXT_DI_AZ cmdResult: empty
2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: ON
2018-01-21 17:13:07 OWSWITCH Aktor_AZ B: OFF
2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: ON B: OFF
2018-01-21 17:13:07 OWSWITCH Aktor_AZ gpio: 2



viegener

@UweH - Schön, dass es funktioniert. Deshalb die folgenden Tipps:
1) Immer den Event-Monitor heranziehen (auch bei Notify etc) - Readinginhalte sind anders
2) Eher den Ausdruck allgemein und einfach anfangen und dann einschränken - das kann zwar später zu Doppelmatches führen, aber am Anfang ist das besser - d.h. wenn nur ein Leerzeichen erwartet wird trotzdem .* dazwischen machen - Trennzeichen wie : etc erstmal rauslassen - erstmal nur einen Wert abfragen (in diesem Fall ON) und später vereinfachen - usw.
3) Wenn es nicht geht erstmal schauen ob der regexp nicht geht oder der auszuführende Befehl - also dahinter etwas einbauen, dass auf jeden Fall funktioniert oder einen Regexp .* einsetzen

Der Doppelpunkt geht auf einem System weil er möglicherweise auf den State matcht - Das ist übrigens noch ein Problem:
Der Ausdruck:
[Aktor_AZ.*Treppe.*ON|OFF]

matcht sowohl

2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: ON


als auch
2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: ON B: OFF


als auch

2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: OFF B: ON


und der letzte wäre eher kontraproduktiv - Hier wirst Du noch nachbessern müssen

Hier muss es dann doch noch spezieller werden, am besten wäre wohl
[Aktor_AZ.Treppe.*ON|OFF]
und ausserdem das Attribut "addStateEvent" auf 1 setzen
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

UweH

Zitat von: viegener am 21 Januar 2018, 18:13:21
@UweH - Schön, dass es funktioniert. Deshalb die folgenden Tipps:
1) Immer den Event-Monitor heranziehen (auch bei Notify etc) - Readinginhalte sind anders
2) Eher den Ausdruck allgemein und einfach anfangen und dann einschränken - das kann zwar später zu Doppelmatches führen, aber am Anfang ist das besser - d.h. wenn nur ein Leerzeichen erwartet wird trotzdem .* dazwischen machen - Trennzeichen wie : etc erstmal rauslassen - erstmal nur einen Wert abfragen (in diesem Fall ON) und später vereinfachen - usw.
3) Wenn es nicht geht erstmal schauen ob der regexp nicht geht oder der auszuführende Befehl - also dahinter etwas einbauen, dass auf jeden Fall funktioniert oder einen Regexp .* einsetzen

Der Doppelpunkt geht auf einem System weil er möglicherweise auf den State matcht - Das ist übrigens noch ein Problem:
Der Ausdruck:
[Aktor_AZ.*Treppe.*ON|OFF]

matcht sowohl

2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: ON


als auch
2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: ON B: OFF


als auch

2018-01-21 17:13:07 OWSWITCH Aktor_AZ Treppe: OFF B: ON


und der letzte wäre eher kontraproduktiv - Hier wirst Du noch nachbessern müssen

Hier muss es dann doch noch spezieller werden, am besten wäre wohl
[Aktor_AZ.Treppe.*ON|OFF]
und ausserdem das Attribut "addStateEvent" auf 1 setzen


Danke für die Tipps, aber langsam bin ich am Verzweifeln. Nicht der Ausdrücke wegen, sondern weil es nur auf einem meiner 4 Displays halbwegs funktioniert, d.h., trotz "addStateEvent" = 1 werden die val nicht gesendet und aktualisiert. Manchmal wird nach ein paar Minuten dann doch noch ein Status im Display geändert. Meist auch dann, wenn ich einen Button auf dieser Seite schalte, dann werden die anderen aktualisiert.
Ich kann jederzeit den Status eines Objektes per "set..." Befehl "von Hand" ändern, von allein jedoch macht es nur ein Display und das auch nur auf einer Seite. Alle anderen Seite ignorieren die Statusänderung eines Devices. Ich weiß auch nicht, wie ich das nun genau beschreiben soll.

Ich schwenke jetzt wieder auf die alte Version zurück, das ist mir zu stressig.

Gruß
Uwe

UweH

Noch mal ein paar Nerven zusammengekratzt...4 Displays mit 14 Seiten und insgesamt ca 40 Objekte, die ihren Status aktualisieren wollen...ist zuviel. FHEM geht so in die Knie, dass das Aktualisieren der Werte einige Minuten pro Displayseite dauert. Alle initPage-Einträge wieder auf den alten Stand gebracht und schwupps ist der Hokuspokus vorbei und FHEM ist wieder so schnell wie vorher.


Was nun?


Gruß
Uwe

viegener

Zitat von: UweH am 22 Januar 2018, 21:29:43
Noch mal ein paar Nerven zusammengekratzt...4 Displays mit 14 Seiten und insgesamt ca 40 Objekte, die ihren Status aktualisieren wollen...ist zuviel. FHEM geht so in die Knie, dass das Aktualisieren der Werte einige Minuten pro Displayseite dauert. Alle initPage-Einträge wieder auf den alten Stand gebracht und schwupps ist der Hokuspokus vorbei und FHEM ist wieder so schnell wie vorher.


Was nun?


Im ersten Moment fallen mir dazu zwei Möglichkeiten ein:
Entweder sind die regexp das Problem, oder meine Implementierung

Heisst das, das Du dieselben Ausdrücke wieder als DOIF oder notify laufen lässt und dann hast Du dieselbe Funktionalität mit Aktualisierung aber es läuft schneller?

Ein logfile wäre schon interessant, damit ich schauen könnte wo die Zeit verbraten wird
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können