Hallo Leute,
ich denke gerade darüber nach, wie man ein einfaches (meinetwegen) zweizeiliges LCD-Display (I2C oder SPI) via Funk mit FHEM auf dem Raspberry verbinden kann. Gibt es jemanden, der das schon gebaut hat (zwecks Ideen ;- ) )?
Yes, ich habe mehrere in allen Dimensionen und Farben, sind viel zuverlässiger und energiesparender als Tablets. Ich habe zur Zeit zwei Varianten im Einsatz, beide basieren auf ESP, einmal als Bridge und einem Nano mit Firmata, oder mit der espeasy als firmware und direkt an den ESP angeschlossen. Physisch werden die LCD's über I2C Adapter angeschlossen, bei Firmata verwende ich DLCD und I2CLCD, bei espeasy verwende ich DLCD für die Generierung der Inhalte und pushe dann über http ans Display. Funktioniert übrigens auch hervorragend mit den kleinen eleganten OLED Displays, dafür suche ich noch eine Möglichkeit diese in mein Schalterprogramm zu integrieren.
Sent from my iPad using Tapatalk
Was benutzt du für Empfänger (RFM oder CC1101)?
klingt interessant. Wie funktioniert die Ansteuerung (ESP sagt mir nichts) über I2C? Hast Du einen Arduino, der die Schnittstelle zwischen Display und Raspi bildet?
Hier die Infos:
ESP LCD (http://www.esp8266.nu/index.php/LCDDisplay)
ESP OLED (http://www.esp8266.nu/index.php/OLEDDisplay)
ESP Allgemein (http://www.esp8266.nu/index.php/Main_Page)
Der ESP8266 ist ein sehr günstiges Wlan2Seriell Modul. Die Kommunikation läuft komplett über WLan. Somit kannst du das Display unabhängig vom Raspberry mit den Daten füttern.
Gibt hier sogar ein Unterforum: LINK (http://forum.fhem.de/index.php/board,74.0.html)
Zitat von: schka17 am 23 Februar 2016, 16:47:10
Yes, ich habe mehrere in allen Dimensionen und Farben, sind viel zuverlässiger und energiesparender als Tablets. Ich habe zur Zeit zwei Varianten im Einsatz, beide basieren auf ESP, einmal als Bridge und einem Nano mit Firmata, oder mit der espeasy als firmware und direkt an den ESP angeschlossen. Physisch werden die LCD's über I2C Adapter angeschlossen, bei Firmata verwende ich DLCD und I2CLCD, bei espeasy verwende ich DLCD für die Generierung der Inhalte und pushe dann über http ans Display. Funktioniert übrigens auch hervorragend mit den kleinen eleganten OLED Displays, dafür suche ich noch eine Möglichkeit diese in mein Schalterprogramm zu integrieren.
Genau DAS suche ich schon seit ewiger Zeit (inkl. Integration in ein Schalterprogramm). Kannst Du dazu ein bissl mehr Infos geben?
Wenn ich es richtig verstehe (bin ESP-Newbie), dann einfach espeasy auf den ESP flashen und Display anlöten. Klingt easypeasy ;-)
Wie genau pushst Du aus FHEM?
"Problematisch" könnte ein UP-Netzteil sein. Ich vermute eine Fertiglösung kostet ein Vielfaches eines ESPs...
Zitat von: tomster am 24 Februar 2016, 13:31:22
"Problematisch" könnte ein UP-Netzteil sein. Ich vermute eine Fertiglösung kostet ein Vielfaches eines ESPs...
Oh ja. Habe aktuell zwei verschiedene 5V 1A VDE konforme Netzteile im Test. Kostenpunkt 22-35€. Chinanetzteile gibt es ab 2€ (Immer an die kosten für das Haus denken ;) )
Pushen ist recht gut auf der oben genannten Seite beschrieben:
http://<ESP IP address>/control?cmd=oled,<row>,<col>,<text>
It is also possible to switch on or off the OLED or to clear the display. During the off state, the content will be updated according to the latest values or states.
http://<ESP IP address>/control?cmd=oledcmd,on
http://<ESP IP address>/control?cmd=oledcmd,off
http://<ESP IP address>/control?cmd=oledcmd,clear
Ich habe aktuell ein OLED Display in einem Blinddeckel von Gira verbaut. Liegt aber noch auf dem Schreibtisch. Loch in der Größe des Displays aus dem Deckel gedremelt und das Display von hinten eingeklebt
Zitat von: oli82 am 24 Februar 2016, 14:04:19
Ich habe aktuell ein OLED Display in einem Blinddeckel von Gira verbaut. Liegt aber noch auf dem Schreibtisch. Loch in der Größe des Displays aus dem Deckel gedremelt und das Display von hinten eingeklebt
Genau das war auch meine Ansatz (hast ein Foto?). Hab auch GIRA (Serie 55, vermutlich wie du) verbaut und vorhin schon einmal ein paar Blinddeckel zum Testen geshoppt ;-)
OLEDs und ein paar ESPs werd ich gleich Mal suchen. Meine vor 2 Wochen getätigte ESP-Bestellung beim Chinesen wird wohl noch dauern. Wird's aber wohl auch aus DE geben für eine Hand voll Dollar mehr.
Bei den Netzteilen bin ich gerne bereit 25-35 E abzudrücken, wenn ich dann eine vernünftige Lösung bekomme. Die übrigen Bauteilen kosten dafür ja quasi nix...
Zitat von: tomster am 24 Februar 2016, 14:29:10
Genau das war auch meine Ansatz (hast ein Foto?).
Leider komme ich erst in ner Woche wieder an meinen Schreibtisch. Dann poste ich das Foto :)
Das klingt sehr interessant.
Bräuchte ich zu dem ESP8266 auch noch einen Arduino o.ä?
Oder reicht der ESP in Verbindung mit dem entsprechenden Display aus,
um Daten anzeigen zu lassen?
Der Arduino fällt dank ESP-Easy weg
Ich verwende 5V Netzteile von Pollin, da habe ich mal dutzende für unter einem Euro das Stück gekauft, das passt locker in eine UP Dose, hat aber kein Gehäuse, ich verwende die auch meistens in den Steckergehäusen z.b. für Aktoren. Ich habe auch sehr günstige Printnetzteile gefunden, warte auf die erste Lieferung.
Bei Verwendung von LCD's muss man noch aufpassen dass auf dem I2C Bus keine 5V Signale kommen, das mag der Esp nicht so.
Achja, an einer Kleinigkeit verzweifle ich im Moment noch bei espeasy, nämlich mit dem posten von Sonderzeichen wie z.b. ° , das schaffe ich nicht direkt aus fhem sondern nur über ein shell script.
(http://uploads.tapatalk-cdn.com/20160225/4637c849b0fe8b78f75eca2f99363921.jpg)
(http://uploads.tapatalk-cdn.com/20160225/e8ff6bf7ba272e615d7e77002e89f39a.jpg)
Sent from my iPad using Tapatalk
hier ein bischen im Detail:
Variante 1, espeasy (nodemcu devkit 1.0 mit esp-12) und OLED Display über I2C angeschlossen
Screenshot der Konfiguration im espeasy:
Die Werte werden mal direkt aus den angeschlossenen Sensoren übernommen.
Die Uhrzeit (würde auch direkt gehen über ntp server) pushe ich alle Minuten (getriggert durch den Luftsensor der alle Minuten meldet), das ist mal nur um das Konzept zu testen:
Internals:
DEF esp_sensor_4:air.* {
my $Zeit=(ReadingsVal ("FP_Time","state","error"));
my $Datum=(ReadingsVal ("FP_Date","state","error"));
Log 3, "set LCD_esp_sensor_4: $Zeit $Datum";
system("sudo curl -s --request GET \"http://192.168.255.64/control?cmd=oled,1,1,$Zeit\"\> /tmp/null ");
system("sudo curl -s --request GET \"http://192.168.255.64/control?cmd=oled,1,7,$Datum\"\> /tmp/null ");
}
NAME n_LCD_esp_sensor_4
NOTIFYDEV esp_sensor_4
NR 2536
NTFY_ORDER 50-n_LCD_esp_sensor_4
REGEXP esp_sensor_4:air.*
STATE 2016-02-25 10:09:34
TYPE notify
Readings:
2016-02-25 01:17:50 state active
Attributes:
devStateIcon disabled:ios-off active:ios-on-green
room development
verbose 0
offene Punkte hier sind Sonderzeichen (eben das ° Zeichen) und die Rundung der Werte das zur Zeit im Sensor nicht möglich ist.
Variante 2, espeasy (esp-01) mit I2C LCD Display (in der Wintergarten Steuerung):
keine lokalen Sensoren, alle Date gepusht von FHEM,
DLCD device erzeugt/formatiert den Inhalt:
Internals:
NAME LCD_WG
NR 2494
NTFY_ORDER 50-LCD_WG
STATE <br>20.6°C on 6.5°C<br>auto 18°C 0%
TYPE DLCD
Readings:
2016-02-25 10:15:00 Line1 20.6°C on 6.5°C
2016-02-25 07:52:49 Line2 auto 18°C 0%
2016-02-25 01:17:49 Line3 attr dlcdLine3 %time1%
2016-02-25 01:17:49 Line4 attr dlcdLine4 %time1%
2016-02-25 10:16:53 scrollingState 0
2016-02-25 10:15:00 state 10:15:00
Attributes:
dlcdCols 16
dlcdLine1 %2%°C %6% %1%°C
dlcdLine2 %4% %5%°C %3%
dlcdReplaceRegex °=ß
dlcdRows 2
dlcdScrolling 1
dlcdVal1 Outdoor_Weather:temperature
dlcdVal2 TF_IS2:temperature
dlcdVal2formatnum 2+1
dlcdVal3 Heizung_WG:actuator
dlcdVal3formatnum 2+0
dlcdVal4 Heizung_WG:mode
dlcdVal5 Heizung_WG:desired-temp
dlcdVal5formatnum 2+0
dlcdVal6 WG_Automatik:state
dlcdVal7 Heizung_WG:actuator
dlcdVal7formatnum 2+0
room development
stateFormat <br>Line1<br>Line2
ein notify, getriggert durch Änderungen in der Anzeigen startet ein shell-script (ich schaffe es noch nicht das ° Zeichen direkt zu pushen, any input welcome)
Internals:
DEF LCD_WG:Line.* {
Log 1, "set LCD_WG: $EVENT";
my $state = $EVTPART1;
my $TF_WG = sprintf ("%2.0f",ReadingsVal ("TF_IS2","temperature","error"));
my $AT = sprintf ("%2.0f", ReadingsVal ("THPL_Outdoor","temperature","error"));
my $WG_mode = ReadingsVal("WG_Automatik","state","0");
my $HZ_mode = ReadingsVal("Heizung_WG","mode","0");
my $HZ_soll = sprintf ("%2.0f", ReadingsVal("Heizung_WG","desired-temp","0"));
my $HZ_act = ReadingsVal("Heizung_WG","actuator","0");
system("sudo /scripts/set_LCD_WG 192.168.255.62 $TF_WG $AT $WG_mode $HZ_mode $HZ_soll $HZ_act \&> /dev/null 2\>\&1");
}
NAME n_LCD_WG
NOTIFYDEV LCD_WG
NR 2495
NTFY_ORDER 50-n_LCD_WG
REGEXP LCD_WG:Line.*
STATE 2016-02-25 10:17:13
TYPE notify
Readings:
2016-02-25 01:17:49 state active
Attributes:
devStateIcon disabled:ios-off active:ios-on-green
room Events
verbose 0
Das shell script macht den Rest
#!/bin/bash
#STATUS=$@
# Aufruf: ip-adresse Innentemperatur Aussentemperatur WG_Automatik WG_Heizungsautomatik HZ_Solltemperatur Actuator
echo off
Display=$1
IT=$2
AT=$3
WG_mode=$4
HZ_mode=$5
HZ_soll=$6
Actuator=$7
#curl --request GET "http://192.168.255.63/control?cmd=lcd,1,1,Test%20mit%20ßC"
#echo "$STATUS"
function SET_LCD {
curl -s --request GET "http://$Display/control?cmd=lcd,$l,$c,$msg" &> /dev/null 2>&1
#echo "$msg"
}
#clear the display
curl --request GET "http://$Display/control?cmd=lcdcmd,clear" > /dev/null 2>&1
#Innentemperatur
msg="$ITßC"
l="1"
c="1"
SET_LCD
####Aussentemperatur
msg="$ATßC"
l="1"
c="12"
SET_LCD
####WG_Modus
msg="$WG_mode"
l="1"
c="7"
SET_LCD
####HZ_Modus
msg="$HZ_mode"
l="2"
c="7"
SET_LCD
####Solltemperatur
msg="$HZ_sollßC"
l="2"
c="1"
SET_LCD
####Solltemperatur
msg="$Actuator"
l="2"
c="14"
SET_LCD
exit
Variante 3, esp-01 mit transparent Bridge firmware, nano mit firmata, LCD über I2C angeschlossen, dieses Display ist in einer Entwicklungsumgebung und die Daten werden per MQTT abgefragt, die Daten/DLCD sind in der Produktionsumgebung und werden von dort zum Broker gepostet:
I/O Device (nano mit firmata über esp):
Internals:
DEF 192.168.255.60:23@57600
DeviceName 192.168.255.60:23@57600
FD 20
NAME WLAN_NANO
NOTIFYDEV global
NR 136
NTFY_ORDER 50-WLAN_NANO
PARTIAL
STATE Initialized
TYPE FRM
analog_pins 14,15,16,17,18,19,20,21
analog_resolutions 14:10,15:10,16:10,17:10,18:10,19:10,20:10,21:10
encoder_pins 2,3
encoder_resolutions 2:28,3:28
firmware firmata_config_o_nw.ino
firmware_version V_2_06
i2c_pins 18,19
input_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
onewire_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
output_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
pwm_pins 3,5,6,9,10,11
pwm_resolutions 3:8,5:8,6:8,9:8,10:8,11:8
servo_pins 2,3,4,5,6,7,8,9,10,11,12,13
servo_resolutions 2:14,3:14,4:14,5:14,6:14,7:14,8:14,9:14,10:14,11:14,12:14,13:14
stepper_pins 2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
stepper_resolutions 2:21,3:21,4:21,5:21,6:21,7:21,8:21,9:21,10:21,11:21,12:21,13:21,14:21,15:21,16:21,17:21,18:21,19:21
Readings:
2016-02-25 09:56:29 state opened
Attributes:
room development
verbose 2
Firmata I2C device:
Internals:
DEF 39 0 2
IODev WLAN_NANO
NAME NANO_I2C
NR 138
STATE defined
TYPE FRM_I2C
i2c-address 39
i2c-bytestoread 2
i2c-register 0
Readings:
2015-10-14 10:32:31 values 0 0
Attributes:
IODev WLAN_NANO
event-min-interval 10
room development
verbose 0
I2C-LCD device
Internals:
DEF 20 4 39
I2C_Address 39
IODev WLAN_NANO
NAME NANO_I2C_LCD
NR 139
STATE 0
TYPE I2C_LCD
sizex 20
sizey 4
Readings:
2016-02-25 09:56:33 backlight on
2016-02-25 09:56:33 text 0
2016-02-25 10:28:08 writeXY 0,0,20,1 10:28 Aussen: 6.6°C
Mapping:
P0 RS
P1 RW
P2 E
P3 LED
P4 D4
P5 D5
P6 D6
P7 D7
Attributes:
IODev WLAN_NANO
pinMapping P0=RS,P1=RW,P2=E,P3=LED,P4=D4,P5=D5,P6=D6,P7=D7
replaceRegex ß=\x{DF},~=\x{7E},⌂=\x{7F},°=\x{DF},>=\x{7E},<=\x{7F}
restoreOnReconnect on
restoreOnStartup on
room development
stateFormat text
verbose 5
MQTT Device (Display content):
Internals:
IODev MQTT
NAME LCD_1
NR 108
STATE 10:31 Aussen: 6.6°C <br>BR: >67°C <70°C 0% <br>WG: >40°C <40°C 0% <br>Mischer: >29°C <28°C
TYPE MQTT_DEVICE
qos 0
retain 0
Readings:
2016-02-25 10:31:03 Line1 10:31 Aussen: 6.6°C
2016-02-25 10:29:30 Line2 BR: >67°C <70°C 0%
2016-02-25 09:56:37 Line3 WG: >40°C <40°C 0%
2016-02-25 10:31:45 Line4 Mischer: >29°C <28°C
2016-02-25 10:31:45 transmission-state incoming publish received
Message_ids:
Sets:
subscribe:
/LCD_1/+
/LCD_1/Line1
/LCD_1/Line2
/LCD_1/Line3
/LCD_1/Line4
subscribeExpr:
^\/LCD_1\/([^/]+)$
^\/LCD_1\/Line1$
^\/LCD_1\/Line2$
^\/LCD_1\/Line3$
^\/LCD_1\/Line4$
Subscribereadings:
/LCD_1/Line1 Line1
/LCD_1/Line2 Line2
/LCD_1/Line3 Line3
/LCD_1/Line4 Line4
Attributes:
IODev MQTT
autoSubscribeReadings /LCD_1/+
event-on-update-reading Line.*
room development
stateFormat Line1 <br>Line2 <br>Line3 <br>Line4
subscribeReading_Line1 /LCD_1/Line1
subscribeReading_Line2 /LCD_1/Line2
subscribeReading_Line3 /LCD_1/Line3
subscribeReading_Line4 /LCD_1/Line4
und das notify um die Änderungen zu pushen
Internals:
DEF LCD_1:Line.* {
my $state = $EVENT;
Log 3, "set LCD1: $EVENT";
if ($state =~ m/Line1/i)
{my $ZeileNo = "1";
my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD writeXY 0,0,20,1 $Zeile";
}
if ($state =~ m/Line2/i)
{my $ZeileNo = "2";
my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD writeXY 0,1,20,1 $Zeile";
}
if ($state =~ m/Line3/i)
{my $ZeileNo = "3";
my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD writeXY 0,2,20,1 $Zeile";
}
if ($state =~ m/Line4/i)
{my $ZeileNo = "4";
my $Zeile = ReadingsVal ("LCD_1","Line$ZeileNo","error");
fhem "set NANO_I2C_LCD writeXY 0,3,20,1 $Zeile";
}
}
NAME n_set_LCD_v2
NOTIFYDEV LCD_1
NR 109
NTFY_ORDER 50-n_set_LCD_v2
REGEXP LCD_1:Line.*
STATE 2016-02-25 10:33:07
TYPE notify
Readings:
2016-02-25 09:56:22 state active
Attributes:
room development
verbose 0
hier noch ein Bild der dritten Variante.
So, und jetzt habe das ganze auch das erste Mal dokumentiert :D
Hallo zusammen,
ich hoffe ich bin hier richtig und darf mich anhängen auch wenn mein Projekt nicht die anforderung Funk hat, da ich bereits Kabel gezogen habe.
Ich versuche ein display und 6 Tasten in eine Blindabdeckung von Merten zu verstauen. Als basis wird ein Arduino nano mit eingepflanzt.
Die Tasteneingaben über Firmata läuft super und auch 1-Wire hatte ich am laufen, nur das display macht probleme.
Display könnte das selbe oled wie von schka17 sein. (128x64 oled i2c ssd1603)
Laut Commandref werden leider auch nur displays mit 2004 oder 1602 unterstützt und ich bin mir nicht sicher ob ich alles richtig gemacht habe.
Laut i2c scanner hat das Display die Adresse 60
Arduino
define Ard01 FRM /dev/ttyUSB0@57600
attr Ard01 i2c-config 1
attr Ard01 room Arduino01
attr Ard01 sampling-interval 1000
attr Ard01 verbose 0
I2C (pin A4 A5) wobei mir völlig unkar ist ob das noch gebraucht wird.
Ich bin auch nicht sicher woher ich die Infos von <register> und <bytes-to-read> her bekomme.
define Firmata_I2C FRM_I2C 60 0 7
attr Firmata_I2C IODev Ard01
das LCD selber
define oled I2C_LCD 128 64 60
attr oled IODev Ard01
attr oled pinMapping P0=RS,P1=RW,P2=E,P3=LED,P4=D4,P5=D5,P6=D6,P7=D7
attr oled room Arduino01
attr oled stateFormat text
Aber vielleicht tut sich hier ja noch ein unterstütztes Display auf was in die Blindabdeckung passt.
Das LCD (getestet mit demo-scetch) ist trotz seiner größe aber wirklich gut abzulesen (weiße schrift)
Bin mal gespannt was hier noch zusammen kommt.
Hallo schka17.
Kannst du bitte mal von Variante2 den Teil aus deiner fhem.cfg hier veröffentlichen?
Aus den Code-Boxen werde ich nicht schlau, da sie fü mich schwer verständlich sind.
Dank und Gruß
beSmart
Zitat von: beSmart am 26 Februar 2016, 22:01:01
Hallo schka17.
Kannst du bitte mal von Variante2 den Teil aus deiner fhem.cfg hier veröffentlichen?
Aus den Code-Boxen werde ich nicht schlau, da sie fü mich schwer verständlich sind.
Dank und Gruß
beSmart
die defs der Variante2 (DLCD device und notify)
define LCD_WG DLCD
attr LCD_WG dlcdCols 16
attr LCD_WG dlcdLine1 %2%°C %6% %1%°C
attr LCD_WG dlcdLine2 %4% %5%°C %3%
attr LCD_WG dlcdReplaceRegex °=ß
attr LCD_WG dlcdRows 2
attr LCD_WG dlcdScrolling 1
attr LCD_WG dlcdVal1 Outdoor_Weather:temperature
attr LCD_WG dlcdVal2 TF_IS2:temperature
attr LCD_WG dlcdVal2formatnum 2+1
attr LCD_WG dlcdVal3 Heizung_WG:actuator
attr LCD_WG dlcdVal3formatnum 2+0
attr LCD_WG dlcdVal4 Heizung_WG:mode
attr LCD_WG dlcdVal5 Heizung_WG:desired-temp
attr LCD_WG dlcdVal5formatnum 2+0
attr LCD_WG dlcdVal6 WG_Automatik:state
attr LCD_WG dlcdVal7 Heizung_WG:actuator
attr LCD_WG dlcdVal7formatnum 2+0
attr LCD_WG room development
attr LCD_WG stateFormat <br>Line1<br>Line2
define n_LCD_WG notify LCD_WG:Line.* {\
Log 1, "set LCD_WG: $EVENT";;\
my $state = $EVTPART1;;\
my $TF_WG = sprintf ("%2.0f",ReadingsVal ("TF_IS2","temperature","error"));;\
my $AT = sprintf ("%2.0f", ReadingsVal ("THPL_Outdoor","temperature","error"));;\
my $WG_mode = ReadingsVal("WG_Automatik","state","0");;\
my $HZ_mode = ReadingsVal("Heizung_WG","mode","0");;\
my $HZ_soll = sprintf ("%2.0f", ReadingsVal("Heizung_WG","desired-temp","0"));;\
my $HZ_act = ReadingsVal("Heizung_WG","actuator","0");;\
system("sudo /scripts/set_LCD_WG 192.168.255.62 $TF_WG $AT $WG_mode $HZ_mode $HZ_soll $HZ_act \&> /dev/null 2\>\&1");;\
}
attr n_LCD_WG devStateIcon disabled:ios-off active:ios-on-green
attr n_LCD_WG room Events
attr n_LCD_WG verbose 0
Die ganzen Infos muss ich erstmal verdauen und nachvollziehen. Trotzdem schonmal danke. Hab vermutlich schon einen meiner Fehler gesehen....
Na, dann schaut mal hier: http://www.fhemwiki.de/wiki/1-Wire_Textdisplay
Und hier: http://www.fhemwiki.de/wiki/Digitaler_Bilderrahmen_mit_lcd4linux
LG
pah
Hallo,
mein LCD Display 16x2 lässt sich wunderbar über I2c ansteuern. Leider verschwindet immer wieder die Verbindung zum RPII2C. Die anderen Teilnehmer haben nicht das Problem.
Jeder Neustart von fhem bzw. dem Raspi3 führt wieder zum Verlust des attr IODev i2cif. Füge ich das attr wieder ein - funktioniert das LCD.
Was könnte die Ursache sein?
Danke