Status Display mit Wemos D1 Mini

Entwicklung und Bau von Hardware aller Art, die im HM-Umfeld eingesetzt werden kann

Moderator: Co-Administratoren

Antworten
Hackertomm
Beiträge: 680
Registriert: 18.04.2018, 12:32
System: Alternative CCU (auf Basis OCCU)
Wohnort: Neuhausen auf den Fildern
Hat sich bedankt: 15 Mal
Danksagung erhalten: 19 Mal

Status Display mit Wemos D1 Mini

Beitrag von Hackertomm » 29.02.2020, 11:56

Es geht ein Status Display dass auf dieser Seite vorgestellt wurde.
Als Ergänzung gab es noch eine weitere Seite, wo die Scriptprogrammierung des Display etwas beschrieben wurde, allerdings eher rudimentär.

Auf Grundlager diese Seiten habe ich das Display nachgebaut, mit einem 4x20 Display und einem etwas anderen Script.
Angepasst eben, an die Sensoren, die ich darstellen will.
Script

Code: Alles auswählen

string stdout;
string stderr;
string url = "http://192.168.2.105/control?cmd=LCD,1,2,'Sensoren u. Status'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
object oGarage = datapoints.Get("BidCos-RF.OEQ2138226:1.STATE");
string sGarage = "Garage ";
if(oGarage.Value()) {sGarage= sGarage#"offen";}else{sGarage=sGarage#"zu";}
string url = "http://192.168.2.105/control?cmd=LCD,2,5,'"#sGarage#"'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
string Temp01 = dom.GetObject("BidCos-RF.JPTH10I001:1.TEMPERATURE").Value().ToString(1);
string url = "http://192.168.2.105/control?cmd=LCD,3,3,'In  "#Temp01#"ßC'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
string Hum01 = dom.GetObject("BidCos-RF.JPTH10I001:1.HUMIDITY").Value().ToString(2);
string url = "http://192.168.2.105/control?cmd=LCD,3,14,'"#Hum01#"%'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
string Temp03 = dom.GetObject("BidCos-RF.JPTH10I003:1.TEMPERATURE").Value().ToString(1);
string url = "http://192.168.2.105/control?cmd=LCD,4,3,'Out "#Temp03#"ßC'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
string Hum03 = dom.GetObject("BidCos-RF.JPTH10I003:1.HUMIDITY").Value().ToString(2);
string url = "http://192.168.2.105/control?cmd=LCD,4,14,'"#Hum03#"%'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
Welches unter Mithilfe aus dem CuXD Forum hier umgesetzt wurde.

Da wurde zb. in einem der letzten Beiträge geschrieben, dass es auch noch bessere Möglichkeiten gäbe, das Display bzw. dessen Anzeige zu steuern.

Momentan sieht die Anzeige so aus:
Bild

Die 1. Zeile ist nur eine Überschrift, rein Text.
Die 2. Zeile zeigt den Zustand meines Garagentores, anhand eines HM-Sec-SCo.
Die 3. Zeile zeigt die Werte so eines Selbsbausensors, für den Innenbereich.
Die 4. Zeile zeigt die eines 2. Selbsbausensors, der allerdings wettergeschützt im Außenbereich hängt.

Wer Vorschläge zum Ändern der Anzeige hat, ich bis dafür Offen.
Gruß
Hackertomm

Virtual Image auf einer Qnap TS-451D2, 2GHZ Celeron u. 8GB RAM, aktuell Raspberry OVA, Vers. 3.71.12.20231020

Martin62
Beiträge: 681
Registriert: 09.12.2019, 21:24
Hat sich bedankt: 151 Mal
Danksagung erhalten: 61 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von Martin62 » 29.02.2020, 16:13

Hallo, was soll man da noch anders machen. Wenn du diese Infos haben möchtest, dann ist das doch gut. Danke für das Script! Bin noch Neuling in der Richtung und über jede Veröffentlichung dankbar.
Ich persönlich finde ein max-, min Tempwert immer interessant. Dafür könnte man die Überschrifft opfern, ist ja auch so eindeutig. Wäre mein einziger Vorschlag.
Gruß Martin
Gruß Martin

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von Baxxy » 01.03.2020, 16:23

Hackertomm hat geschrieben:
29.02.2020, 11:56
Da wurde zb. in einem der letzten Beiträge geschrieben, dass es auch noch bessere Möglichkeiten gäbe, das Display bzw. dessen Anzeige zu steuern.
Deine Ansteuerung ist ja soweit in Ordnung. Das "besser" bezog sich auf Alchy's Hinweis das es nicht gut sein kann so viele system.Exec Aufrufe in so kurzer Zeit hintereinander abzusenden. (bei Deinem aktuellen Script sind es sogar 6 system.Exec Aufrufe) Inwieweit sich das tatsächlich auf die CCU und deren Stabilität auswirkt kann ich aber nicht beurteilen. Da vertraue ich einfach auf Alchy's Kenntnis des Systems.

Was kann man also tun?
1. Man könnte ein Programm erstellen das beim CCU-Start das Display einmalig löscht und verzögert die festen Bestandteile (in deinem Fall Zeile 1) schreibt.

2. Da jeder deiner Sensoren eine eigene Zeile auf dem Display hat könnte man 3 separate Programme anlegen in denen sich das Script nur um die jeweilige Zeile kümmert. Da könnte man auch gleich Temperatur & Feuchtigkeit in einem Rutsch schreiben.
Beispiel für deinen Innensensor:

Code: Alles auswählen

string stdout;
string stderr;
string Temp01 = dom.GetObject("BidCos-RF.JPTH10I001:1.TEMPERATURE").Value().ToString(1);
string Hum01 = dom.GetObject("BidCos-RF.JPTH10I001:1.HUMIDITY").Value().ToString(2);
string url = "http://192.168.2.105/control?cmd=LCD,3,3,'In  "#Temp01#"ßC%20"#Hum01#"%%20%20'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
3. In Bezug auf 2. ist es,nur bei den Temp/Feuchtesensoren, sinnvoll das Programm auf Aktualisierung zu triggern. Das heißt aber auch das das entsprechende "Zeilenscript" alle 2-3 Minuten (oder wie oft auch immer die Selbstbau-Teile senden) gestartet wird. Das lässt sich nicht vermeiden, aber man könnte z.B. verhindern das das Script jedesmal komplett durchläuft indem man innerhalb des Scripts erstmal prüft ob sich was an den Werten geändert hat. Und nur wenn sich was geändert hat wird dann die Zeile beschrieben. Dazu muss das Script natürlich entsprechend "umgebaut" werden.

4. In Bezug auf 2. ist es für deinen "Garagensensor" am einfachsten. Programm anlegen.
Wenn --> Garage offen --> bei Änderung auslösen
Dann ---> Script

Code: Alles auswählen

string stdout;
string stderr;
string url = "http://192.168.2.105/control?cmd=LCD,2,5,'Garage offen'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
Sonst---> Script

Code: Alles auswählen

string stdout;
string stderr;
string url = "http://192.168.2.105/control?cmd=LCD,2,5,'Garage zu%20%20%20'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
Viel mehr "Optimierungen" fallen mir erstmal nicht ein. Das ganze funktioniert auch nur wenn man nur eine "Statusseite" auf dem Display hat.

Grüße
Baxxy

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von Baxxy » 01.03.2020, 16:52

Hier noch ein Bild meiner 2 LCD's. Das "Gehäuse" ist ein ELV-Pappkarton von einem Funkmodul Bausatz. :lol:
Die beiden Displays sind von verschiedenen Herstellern und haben daher (leider) eine ziemlich unterschiedliche Erscheinung.
LCD4x20_BX.jpg
Grüße
Baxxy

Hackertomm
Beiträge: 680
Registriert: 18.04.2018, 12:32
System: Alternative CCU (auf Basis OCCU)
Wohnort: Neuhausen auf den Fildern
Hat sich bedankt: 15 Mal
Danksagung erhalten: 19 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von Hackertomm » 01.03.2020, 18:47

Ich habe das Script nochmal geändert:

Code: Alles auswählen

string stdout;
string stderr;
string url = "http://192.168.2.105/control?cmd=LCD,1,2,'Sensoren u. Status'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
object oGarage = datapoints.Get("BidCos-RF.OEQ2138226:1.STATE");
string sGarage = "Garage ";
if(oGarage.Value()) {sGarage= sGarage#"offen";}else{sGarage=sGarage#"zu";}
string url = "http://192.168.2.105/control?cmd=LCD,2,5,'"#sGarage#"'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
string Temp01 = dom.GetObject("BidCos-RF.JPTH10I001:1.TEMPERATURE").Value().ToString(1);
string Hum01 = dom.GetObject("BidCos-RF.JPTH10I001:1.HUMIDITY").Value().ToString(2);
string url = "http://192.168.2.105/control?cmd=LCD,3,3,'In  "#Temp01#"ßC%20"#Hum01#"%%20%20'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
string Temp03 = dom.GetObject("BidCos-RF.JPTH10I003:1.TEMPERATURE").Value().ToString(1);
string Hum03 = dom.GetObject("BidCos-RF.JPTH10I003:1.HUMIDITY").Value().ToString(2);
string url = "http://192.168.2.105/control?cmd=LCD,4,2,'Out  "#Temp03#"ßC%20"#Hum03#"%%20%20'";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
Vor Ausführung dieses Scripts startet folgendes Script, zeitverzögert um 1 Sekunde.

Code: Alles auswählen

string stdout;
string stderr;
string url="http://192.168.2.105/control?cmd=lcdcmd,clear";
system.Exec ("wget -q -O /dev/null " #url, &stdout, &stderr);
Dieses Script löscht einfach das Display komplett.

Es sind jetzt nur noch 4 System Exex Aufrufe, einer pro Displayzeile.
Es ist leider jeder Aufruf nötig, weil auf dem Display wieder ganze Zeilen verschwinden oder erst gar nicht erscheinen.
Die Garage im Script, da wird True oder False abgefragt, über einen opt. Tür/Fensterkontakt und in einen Text umgesetzt, das will ich so haben.
So lass ich das Script erstmal mal.

So ein Blaues Display habe ich ebenfalls, das arbeitet aber nicht ohne Hintergrundbeleuchtung, dieses Grüne jedoch schon.
Auf dem Foto ist keine Hintergrundbeleuchtung eingeschaltet, das spart Strom.
Das Grüne Display braucht ohne Hintergrundbeleuchtung genau 100mA, ein Blaues Display mit Hintergrundbeleuchtung 130mA, beide incl. Wemos.
Ich könnte ja auch anhand der Uhrzeit die Displaybeleuchtung Anschalten oder Ausschalten.
Aber ich habe da grad eine kleine 1800mAh Powerbank als Stromquelle dran und einen USB Energimesser dazwischen und teste grade, wie lange das Display damit durch hält.
Gruß
Hackertomm

Virtual Image auf einer Qnap TS-451D2, 2GHZ Celeron u. 8GB RAM, aktuell Raspberry OVA, Vers. 3.71.12.20231020

sickboy2711
Beiträge: 250
Registriert: 12.11.2011, 16:58
System: CCU
Wohnort: Schweiz
Hat sich bedankt: 25 Mal
Danksagung erhalten: 6 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von sickboy2711 » 31.08.2023, 19:27

Ich hätte hier noch einen Vorschlag mit CuxD und die IP des Wemos sowie die Zeile und den Text als Variable am Anfang.
Den Text String könnte man auch bsp. als Abfrage einer SysVar oder anderem zusammen bauen.

Indem Fall wird das Script ausgelöst, sobald das Gerät an ist.
Im Display wird erst die jeweilige Zeile gelöscht, dann die Beleuchtung eingeschaltet dann der Wert übertragen.

Code: Alles auswählen

 string IP = "192.168.2.151";
string txt = "Trockner      an";
string zeile = "2";
string url = "http://"#IP#"/control?cmd=LCD#zeile#,clear";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
string url = "http://"#IP#"/control?cmd=lcdcmd,on";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
string url = "http://"#IP#"/control?cmd=LCD,"#zeile#",1,"#txt#"";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
5 Minuten später schaltet sich das Display mit diesem Script wieder aus:

Code: Alles auswählen

 string IP = "192.168.2.151";
string url = "http://"#IP#"/control?cmd=lcdcmd,off";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
Vielleicht kann es ja jemand gebrauchen.

Benutzeravatar
Baxxy
Beiträge: 10648
Registriert: 18.12.2018, 15:45
System: Alternative CCU (auf Basis OCCU)
Hat sich bedankt: 597 Mal
Danksagung erhalten: 2180 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von Baxxy » 31.08.2023, 20:03

sickboy2711 hat geschrieben:
31.08.2023, 19:27
Im Display wird erst die jeweilige Zeile gelöscht,
Jetzt hab ich mich gefreut das jemand mal was postet was ich gebrauchen kann und noch nicht kannte...

Aber letztlich funktioniert das bei meinen LCD2004 nicht.
Und ich staune das das bei dir funktioniert, denn wenn wir und mal die url zum löschen der Zeile genauer ansehen kann ich mir nicht vorstellen das das funktional ist.

So sieht dein url String aus:

Code: Alles auswählen

http://192.168.2.151/control?cmd=LCD#zeile#,clear

sickboy2711
Beiträge: 250
Registriert: 12.11.2011, 16:58
System: CCU
Wohnort: Schweiz
Hat sich bedankt: 25 Mal
Danksagung erhalten: 6 Mal

Re: Status Display mit Wemos D1 Mini

Beitrag von sickboy2711 » 09.09.2023, 08:51

Hallo Baxxi

Stimmt du hast absolut recht, das Kommando zum löschen von nur einer Zeile geht bei dem LCD nicht so einfach.
Ist mir gar nicht aufgefallen, da ich die Zeilen einfach überschrieben habe.

Als Anweisung könntest du folgendes nehmen:

Code: Alles auswählen

string url = "http://"#IP#"/control?cmd=LCDCMD,clear";
Dann wird aber der gesamte Inhalt gelöscht.

Für einzelne Zeilen müsstest du es via überschreiben mit Leerzeichen machen:

Code: Alles auswählen

string IP = "192.168.2.151";
string txt = "Waschm.      aus";
string clear = "                ";
string zeile = "1";
string url = "http://"#IP#"/control?cmd=LCD,"#zeile#",1,"#clear#"";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
string url = "http://"#IP#"/control?cmd=lcdcmd,on";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
string url = "http://"#IP#"/control?cmd=LCD,"#zeile#",1,"#txt#"";
dom.GetObject("CUxD.CUX2801001:1.CMD_EXEC").State("wget -q -O /dev/null '"#url#"'");
Wobei die Anzahl der Leerzeichen der einzelnen Zeichen entsprechen.
Bei einem 2004 wären es dann 20 Leerzeichen, bei einem 1602 entsprechend 16 Leerzeichen.

Wenn du erst ab einem bestimmten Zeichen anfangen möchtest kannst du den Parameter 1 im String noch anpassen, dieser setzt den Curser auf die entsprechende Zelle.

Code: Alles auswählen

string url = "http://"#IP#"/control?cmd=LCD,"#zeile#",8,"#txt#"";
Würde dann den Text erst ab der 8. Stelle beginnen. Dementsprechend müsste dein Text aber auch kürzer ausfallen.
Aber das kennst du ja schon

Antworten

Zurück zu „Hardwareentwicklung und Selbstbau von Aktoren und Sensoren“