Wegen dir überlege ich aktuell den Code der neuen Qlock2 irgendwie an OH anzubinden.
Also die Uhr als Anzeigendisplay. Ist ja auch nur eine 11x10 Matrix, nüchtern betrachtet.
Openhab + Wemos + MQTT + MAX7219 LED Dot Matrix
-
horschte -
25. September 2019 um 08:49 -
Unerledigt
-
-
was willst du da genau anbinden? eine steuerung der leds durch oh?
-
-
Ja, aber noch nichts Konkretes im Kopf.
Ggf Warnhinweise, wenn ich irgendwas zu lange offen habe etc.
Aber bis das so weit ist, melde ich mich wieder. -
von x-y uhr farbe weiss, sonst rot....nachts auch dimmen usw usw. das war meine idee gestern als ich gefragt hab
-
-
könnte man dann auch als status anzeigen nutzen zB wenn der türgong klingel werden alle LEDs rot und blinken oder sowas
-
Ich habe am code von @horschte ein bisserl herumgespielt (quick and dirty zusammengeklaut).
Wird unter dem topic LEDMatrix/modus die payload 1 gepublished wird der Text statisch und nicht als Lauftext dargestellt
Wird unter dem topic LEDMatrix/time die payload 1gepublished wird die Uhrzeit als statischer Text dargestellt. Will man lieber die Uhr als Lauftext kann man danach unter LEDMatrix/modus die payload 0 publishen. Es dauert ein bisschen, bis die richige Zeit vom NTP Server geholt wird
vielleicht kanns ja jemand brauchen...
C
Alles anzeigen#include <SPI.h> #include <Adafruit_GFX.h> #include <Max72xxPanel.h> #include <ESP8266WiFi.h> #include <PubSubClient.h> #include <time.h> #define MQTT_USER "XXXX" #define MQTT_PASSWORD "XXXX" // Belegung //DOT Matrix: ESP8266 NodeMCU: //VCC 5V (VUSB) //GND GND //DIN D7 (GPIO13) //CS D3 (GPIO0) //CLK D5 (GPIO14) int pinCS = 0; int numberOfHorizontalDisplays = 16; //Anzahl der Module Horizontal int numberOfVerticalDisplays = 1; //Anzahl der Module Vertikal const byte buffer_size = 45; char time_value[buffer_size]; const char* ssid = "XXXX"; const char* password = "XXXX"; const char* mqtt_server = "XXXX"; int timeswitch = 1; WiFiClient espClient; PubSubClient client(espClient); Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); int wait = 70; // In milliseconds int ScrollWait = 25; // Zeit in ms für Scroll Geschwindigkeit int helligkeit = 5; // Helligkeit des DisplaysDefault Helligkeit 0 bis 15 int spacer = 1; // Länge eines Leerzeichens int width = 5 + spacer; // Schriftgröße String MatrixText = ""; int modus = 0; // Modus 0 = Marquee, 1 = static void setup_wifi() { delay(10); // Wifi Verbindung Serial.println(); Serial.print("Verbinde mit "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi verbunden :)"); Serial.println("IP Addresse: "); Serial.println(WiFi.localIP()); } void MQTTCallback(char* topic, byte* payload, unsigned int length) { String PayloadString = ""; for (int i = 0; i < length; i++) { PayloadString = PayloadString + (char)payload[i]; } Serial.println("Eingehender Befehl"); Serial.println(topic); Serial.println(PayloadString); if(strcmp(topic, "LEDMatrix/text") == 0) { Serial.println("Neuer Text wurde gesetzt"); timeswitch = 0; modus = 0; MatrixText = PayloadString; } if(strcmp(topic, "LEDMatrix/intensity") == 0) { Serial.println("Neue Helligkeit wurde gesetzt"); helligkeit = PayloadString.toInt(); matrix.setIntensity(helligkeit); } if(strcmp(topic, "LEDMatrix/scrollwait") == 0) { Serial.println("Neue Scrollgeschwindigkeit wurde gesetzt"); ScrollWait = PayloadString.toInt(); } if(strcmp(topic, "LEDMatrix/time") == 0) { Serial.println("Time aktiviert"); timeswitch = PayloadString.toInt(); } if(strcmp(topic, "LEDMatrix/modus") == 0) { Serial.println("set new Modus"); modus = PayloadString.toInt(); } } void reconnect() { while (!client.connected()) { // Client ID generieren String clientId = "LEDMatrix-"; clientId += String(random(0xffff), HEX); // Verbindung if (client.connect(clientId.c_str(), MQTT_USER, MQTT_PASSWORD)) { Serial.println("Mit MQTT verbunden :)"); client.subscribe("LEDMatrix/text"); client.subscribe("LEDMatrix/intensity"); client.subscribe("LEDMatrix/scrollwait"); client.subscribe("LEDMatrix/time"); client.subscribe("LEDMatrix/modus"); } else { Serial.print("Fehler, :("); Serial.print(client.state()); Serial.println(" neuer Versuch in 2 Sekunden"); delay(5000); } } } void setup() { //delay(1000); matrix.setIntensity(helligkeit); for (int matrixIndex=0 ; matrixIndex < numberOfHorizontalDisplays ; matrixIndex++ ) { matrix.setRotation(matrixIndex, 1); //Erste DOT Matrix Drehen } Serial.begin(115200); Serial.println("Starte LEDMatrix..."); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(MQTTCallback); configTime(0 * 3600, 0, "pool.ntp.org", "time.nist.gov"); // See https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv for Timezone codes for your region setenv("TZ", "CET-1CEST,M3.5.0/02,M10.5.0/03",1); } void printMatrix() { switch (modus) { case 0: for ( int i = 0 ; i < width * MatrixText.length() + matrix.width() - 1 - spacer; i++ ) { matrix.fillScreen(LOW); int letter = i / width; int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; //Zentrieren des Textes Vertikal while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < MatrixText.length() ) { matrix.drawChar(x, y, MatrixText[letter], HIGH, LOW, 1); } letter--; x -= width; client.loop(); } matrix.write(); delay(ScrollWait); } break; case 1: matrix.fillScreen(LOW); int letter = 15; int x = 128; int y = (matrix.height() - 8) / 2; //Zentrieren des Textes Vertikal while ( x + width - spacer >= 0 && letter >= 0 ) { if ( letter < MatrixText.length() ) { matrix.drawChar(x, y, MatrixText[letter], HIGH, LOW, 1); } letter--; x -= width; client.loop(); } matrix.write(); delay(ScrollWait); break; } } String get_time(){ time_t now; time(&now); char time_output[buffer_size]; // See http://www.cplusplus.com/reference/ctime/strftime/ for strftime functions // Desired format: ( Sun ,Jul 21 2019 ) ( AM 10:03:20 ) strftime(time_output, buffer_size, "%T", localtime(&now)); return String(time_output); // returns ( Sat 20-Apr-19) ( AM 12:31:45 ) } void loop() { if (!client.connected()) { reconnect(); } client.loop(); delay(100); if (timeswitch == 1) { modus = 1; MatrixText = get_time(); MatrixText.trim(); Serial.println(MatrixText); MatrixText.substring(23,28).toCharArray(time_value, 10); Serial.println("HH:MM"); Serial.println(time_value); } printMatrix(); }
-
-
Hallo
habe Scetch von Momo90 geladen, unter "LEDMatrix/text" wenn ich was eingebe kommt text, aber LEDMatrix/time läuft nicht.
kann mir jemand weiter helfen?
Vielen Dank im voraus. -
Wenn ich mich richtig rinnere musst du unter dem topic LEDMatrix/time die payload 1 publishen.
Was hast du gepublisht?Ich verwende jetzt das da https://github.com/jptrsn/clock-message-board
finde ich weit besser. Da ist auch noch ein PR von mir offen, sodass du auch die Helligkeit via mqtt steuern kannst
-
-
ich habe nur Zugangsdaten angepasst sonst nichts geändert.
in Arduino / Scetch usw. habe ich nicht viel Ahnung.
an welche stelle finde ich LEDMatrix/time die payload evtl. zeile oder so
nicht das ich was falsch mache. -
Ich verwende jetzt das da http://github.com/jptrsn/clock-message-board
sind da bibliotheken mit sonderzeichen drin? edit....selbst schon gesehen.
poste mal ne hübsche config für den sketch und ne openhab rule (wenn du das damit einsetzt) -
-
ich sehe keins. im Anhang habe ich Kopie.
-
Ich sitze im moment im Büro fest, aber habe ein altes OH Backup mit, da sollte was passendes drauf sein.
things
Code
Alles anzeigenThing topic messageboard "Messageboard" { Channels: Type string : Displaytext [commandTopic="messageboard/messages", formatBeforePublish="{ \"message\":\"%s\" }"] Type string : Displayhelligkeit [commandTopic="messageboard/messages", formatBeforePublish="{ \"lum\":\"%s\" }"] Type string : Wiederholungen [commandTopic="messageboard/messages", formatBeforePublish="{ \"repeat\":\"%s\" }"] Type string : Geschwindigkeit [commandTopic="messageboard/messages", formatBeforePublish="{ \"frameDelay\":\"%s\" }"] Type string : Raw [commandTopic="messageboard/messages"] }
Items
Code
Alles anzeigenString Display_Text "Displaytext [%s]" {channel="mqtt:topic:mosquitto:messageboard:Displaytext"} String Display_Helligkeit "Displayhelligkeit (0-15) [%s]" {channel="mqtt:topic:mosquitto:messageboard:Displayhelligkeit"} String Display_Wiederholungen "Anzahl der Wiederholungen [%s]" {channel="mqtt:topic:mosquitto:messageboard:Wiederholungen"} String Display_Geschwindigkeit "Display Geschwindigkeit [%s]" {channel="mqtt:topic:mosquitto:messageboard:Geschwindigkeit"} String Display_Raw {channel="mqtt:topic:mosquitto:messageboard:Raw"}
eine rule hab ich auch noch:Code
Alles anzeigenrule "bewegungsmelder keller" when Item XiaomiAqaraMotionSensor1Motion changed to ON then var jsonString1 = "{\"led\":\"Blink\",\"delay\":10,\"color\":\"0xff0000\"}" var jsonString2 = "{\"cmd\":\"break\"}" var jsonString3 = "{ \"message\": \"XXXXXXX\", \"repeat\":1, \"textEffect\": {\"in\":15, \"out\":15}}" Esparkle_Command.sendCommand(jsonString1) Display_Raw.sendCommand(jsonString3) Thread::sleep(1000) Esparkle_Command.sendCommand(jsonString2) end
das Thread::sleep möge man mir verzeihen, muss ich ändern.
Sinn hinter der rule: ich zocke regelmäßig im Keller auf einer Leinwand mit der PS4. Dabei habe ich kopfhörer auf. Wenn jetzt meine bessere Hälfte auf einmal im Türrahmen steht, schreck ich mich regelmäßig, weil ich sie wegen der Kopfhörer nicht höre. Der Xiaomi Motion Sensor steht beim Kellerabgang, das Diplay in der Nähe der Leinwand. Wenn jemand in den Keller Kommt tauchen XXXXX auf und ich schreck mich nicht so.Zusätzlich habe ich über Tasker einen Task laufen, der mir auf dem Display anzeigt, wenn ich eine Whatsapp oder einen Anruf von meiner Lebensgefährtin erhalte. Das Handy höre ich nämlich auch nicht wenn ich zocke, was die Lebensgefährtin nervt. Happy wife, happy life!
Den Temperatursensor und den WS2812 Led Stripe nutze ich nicht.
Das da https://github.com/prysme01/DotMatrixDisplay und das https://hackaday.io/project/28555-…scussions-title habe ich auch gerade wieder in meinen Lesezeichen gefunden. Ist ähnlich, habe ich aber nie benutzt. Letzteres konnte ich glaublich nicht auf den wemos hochladen. Von ersterem hab ich offenbar die Helligkeitsregelung geklaut
-
-
ich habe nur Zugangsdaten angepasst sonst nichts geändert.
in Arduino / Scetch usw. habe ich nicht viel Ahnung.
an welche stelle finde ich LEDMatrix/time die payload evtl. zeile oder so
nicht das ich was falsch mache.Du musst dich via mqttfx oder ähnlichem mit deinem MQTT broker verbinden. Dort dann in dem genannten topic die payload publishen.
Topic, payload und mqtt sagt dir was, oder? -
Momo90 ich danke dir für deine Mühe,
Ich schaue was ich machen kann.Aufgebaut habe ich das ganze auf Wemos D1 Mini der verbindet sich dann mit mqtt.
Mqtt läuft in ioBrokerDanke.
-
-
Wenn ich mich richtig rinnere musst du unter dem topic LEDMatrix/time die payload 1 publishen.
Was hast du gepublisht?Ich verwende jetzt das da https://github.com/jptrsn/clock-message-board
finde ich weit besser. Da ist auch noch ein PR von mir offen, sodass du auch die Helligkeit via mqtt steuern kannst
------------------
Ich würde den Sketch eigentlich gerne zum laufen bringen.... aber mir gehts auch so, wenn ich beim topic LEDMatrix/time die payload 1 publishe dann passiert gar nichts. Die Zeit wird nicht angezeigt. Hast du eine Lösung?
-
Bitte nimm den sketch von hier github.com/jptrsn/clock-message-board
Der funktioniert bei mir seit ca 1 jahr völlig stabil und kann das selbe die der oben -
-
Super Ding! Mir gefällt der Sketch von horschte besser. Umlaute ersetze ich der Einfachheit halber mit einer OH-Rule (habs anders nicht hinbekommen)
Code
Alles anzeigenrule "Umlaute ersetzen" when Item DotDisplayRed_Displaytext changed then var text = DotDisplayRed_Displaytext.state.toString.replace('ä', 'ae').replace('ö', 'oe').replace('ü', 'ue').replace('ß', 'ss') DotDisplayRed_Displaytext.sendCommand(text) //logInfo("Umlautersetzung: ", text) end
-
Umlaute ersetze ich der Einfachheit halber mit einer OH-Rule
auch ne gute idee, bin ich nicht drauf gekommen. ich muss mein display auch endlich mal wieder in betrieb nehmen. muss mir nur überlegen wo ich das teil jetzt einbaue. den schrank von früher gibts nicht mehr.
-
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!