Analyse Boom Table
200x350
Dieses Ausgabeformat nennt sich auch X BitMap (XBM) aka. “XBM – X Windows system bitmap, black and white only”, siehe X BitMap - Wikipedia.
Hier im Artikel wird beschrieben, dass auch GIMP dieses Format erzeugen kann.
Im obigen Artikel wird auch der Image Converter genannt – ebenfalls ein Online-Werkzeug.
Habe gestern Nacht Mal angefangen zu experimentieren und Div. BMP per Http und Https in einen Buffer zu laden und aus dem Buffer wieder anzuzeigen.
Habe dafür das WiFi Beispiel von GxEPD2 genommen.
Dann fehlt nur noch die Decodierung vor der eigentlichen Anzeige, das wenn die Treiber keine Probleme machen klappen sollte.
Die BMP lade und Anzeige Funktion lasse ich aber drin, man weiß ja nie ob jemand das nicht doch mal brauchen könnte. Zusätzliche Libarys werden dafür eh nicht gebraucht.
Durch das Antialiasing des Bildes ist es evtl. Sogar ratsam das Bild etwas größer zu laden, in SW umzuwandeln und dann erst zu verkleinern so wirken die Kanten evtl. schärfer.
Müssten wir auf alle Fälle dann ausprobieren wenn es funktioniert. Also erstmal bitte nichts an den Pannels ändern, könnte sein, das das kontraproduktiv ist.
Ich fass nix an, nur der Hinweis: Man kann in dem Boom-table-plugin auch sehr fein mit der Schriftgröße rumspielen. (In den Einstellung einjeden “Patterns” janz unten.)
Folgendes kleines Werkzeug kann uns u.U. weiterhelfen, welches auf der Python Imaging Library Pillow basiert:
imagecast \
--uri="https://unsplash.com/photos/WvdKljW55rM/download?force=true" \
--monochrome=80 --crop=850,1925,-950,-900 --width=320 --format=xbm
# Define URI to image
export IMAGE='https://swarm.hiveeyes.org/grafana/render/d-solo/start/welcome?orgId=2&panelId=9&from=1555547678893&to=1557998019523&var-beekeeper=All&var-COMMON_CDC_NAME=Berlin-Tegel&var-COMMON_MOSMIX_NAME=BERLIN-TEGEL&var-STATION=Berlin-Tegel&var-sensors=default_1_sensors&theme=light&width=400&height=300&tz=Europe%2FBerlin'
# Convert image to monochrome, also slightly crop and resize
imagecast --uri="$IMAGE" --monochrome=200 --crop=40,50,-50,-40 --width=200 --display
# Try grayscale
imagecast --uri="$IMAGE" --grayscale --crop=40,50,-50,-40 --width=200 --display
# Define URI to image
export IMAGE='https://swarm.hiveeyes.org/grafana/render/d-solo/OvnLNPqiz/statista-stockubersicht-and-bienenwetter-testvolk-zk-u?panelId=23&orgId=2&from=1546297200000&to=1577833199999&var-beekeeper=hiveeyes_open_hive_test_statista&var-sensors=All&var-COMMON_CDC_NAME=Berlin-Tegel&var-COMMON_MOSMIX_NAME=BERLIN-TEGEL&var-STATION=Berlin-Tegel&theme=light&width=200&height=350&tz=Europe%2FBerlin'
# Same procedure.
imagecast --uri="$IMAGE" --monochrome=200 --crop=20,40,-20,-40 --display
imagecast --uri="$IMAGE" \
--monochrome=200 --crop=40,50,-50,-40 --width=130 \
--format=bytes > graph.raw
Als bi-level bitmap aka. MONO:raw
hat dieser Eumel dann nur noch eine Größe von 1496 Bytes und könnte ohne Dekodierung direkt in den Framebuffer geladen werden.
imagecast --uri="$IMAGE" \
--monochrome=200 --crop=40,50,-50,-40 --width=130 \
--save=graph.png
Das entsprechende PNG ist sogar nur 429 Bytes klein.
Die Achsenbeschriftungen habe ich bewusst weggeschnitten, weil der Text die extreme Skalierung bestimmt nur wenig ansehnlich überlebt hätte. Bei der entsprechenden e-Paper Bibliothek sind optimierte Fonts für eine deutlich bessere Textausgabe dabei, so dass man damit vielleicht wieder eine Legende anbauen könnte, die zumindest über den dargestellten Zeitraum informiert.
[edit] Mit einer Breite von 400 px ist die Achsenbeschriftung noch lesbar:
Wer Karten nicht legendiert oder Achsen nicht beschriftet,
wer nicht legendierte Karten oder unbeschriftete Achsen in Umlauf bringt, wird
mit Einzelwertetabellen
nicht unter zwei Seiten bestraft.
Damit wollte ich Dich noch zitieren, aber mir ist der Spruch nicht mehr eingefallen. Danke! ;]
Leider läuft bei mir imagecast auf der WSL nicht wie gewünscht.
Hatte mich zwar sehr gewundert, wenn es ein Bild hätte anzeigen können.
Aber ein versuch macht klug
user@Werkstatt:/usr$ export IMAGE='https://swarm.hiveeyes.org/grafana/render/d-solo/OvnLNPqiz/statista-stockubersicht-and-bienenwetter-testvolk-zk-u?panelId=23&orgId=2&from=1546297200000&to=1577833199999&var-beekeeper=hiveeyes_open_hive_test_statista&var-sensors=All&var-COMMON_CDC_NAME=Berlin-Tegel&var-COMMON_MOSMIX_NAME=BERLIN-TEGEL&var-STATION=Berlin-Tegel&theme=light&width=200&height=350&tz=Europe%2FBerlin'
user@Werkstatt:/usr$ imagecast --uri="$IMAGE" --monochrome=200 --crop=20,40,-20,-40 --display
user@Werkstatt:/usr$ display-im6.q16hdri: unable to open X server `' @ error/display.c/DisplayImageCommand/432.
Aber bei dem Service hatte ich mir schon ein paar mehr Chancen ausgerechnet.
user@Werkstatt:/usr$ imagecast service
2020-06-07 00:14:23,996 [imagecast.cli ] INFO : Starting imagecast 0.1.1
2020-06-07 00:14:23,996 [imagecast.cli ] INFO : Starting web service on localhost:9999
INFO: Uvicorn running on http://localhost:9999 (Press CTRL+C to quit)
INFO: Started reloader process [8289] using statreload
ERROR: Error loading ASGI app. Attribute "app" not found in module "imagecast.api".
In der Windows PowerShell gibt es bereits beim Installieren Probleme. PIP findet Pillow 7.1.2 nicht.
wenn ich Pillow Manuell mit Pip ohne Versionierung Installiere Läd er bei mir nur 6.2.2
PS C:\Users\Büro1> pip install imagecast
Collecting imagecast
Using cached https://files.pythonhosted.org/packages/cc/33/a53753e1fd6c58ea53358aa00c14c3d25b0ca9de68be10ceaff3601e8011/imagecast-0.1.1.tar.gz
Collecting docopt==0.6.2 (from imagecast)
Using cached https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz
Collecting munch==2.3.2 (from imagecast)
Using cached https://files.pythonhosted.org/packages/68/f4/260ec98ea840757a0da09e0ed8135333d59b8dfebe9752a365b04857660a/munch-2.3.2.tar.gz
Collecting Pillow==7.1.2 (from imagecast)
Could not find a version that satisfies the requirement Pillow==7.1.2 (from imagecast) (from versions: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7.0, 1.7.1, 1.7.2, 1.7.3, 1.7.4, 1.7.5, 1.7.6, 1.7.7, 1.7.8, 2.0.0, 2.1.0, 2.2.0, 2.2.1, 2.2.2, 2.3.0, 2.3.1, 2.3.2, 2.4.0, 2.5.0, 2.5.1, 2.5.2, 2.5.3, 2.6.0, 2.6.1, 2.6.2, 2.7.0, 2.8.0, 2.8.1, 2.8.2, 2.9.0, 3.0.0, 3.1.0rc1, 3.1.0, 3.1.1, 3.1.2, 3.2.0, 3.3.0, 3.3.1, 3.3.2, 3.3.3, 3.4.0, 3.4.1, 3.4.2, 4.0.0, 4.1.0, 4.1.1, 4.2.0, 4.2.1, 4.3.0, 5.0.0, 5.1.0, 5.2.0, 5.3.0, 5.4.0, 5.4.1, 6.0.0, 6.1.0, 6.2.0, 6.2.1, 6.2.2)
No matching distribution found for Pillow==7.1.2 (from imagecast)
Mit dem Direkten Laden und Decodieren auf dem ESP32 über upng, bin ich auch nicht wirklich weiter gekommen.
Aktuell lande ich beim übergeben des Buffers in einem fiesen Core dump
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6364
entry 0x400806b8
␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀
WiFi.getAutoConnect()=0
WiFi.SSID()=
Connecting to FRITZ!Box 7490
.3
WiFi connected
192.168.178.175
downloading file "statista-stockubersicht-and-bienenwetter-testvolk-zk-u.PNG"
connecting to swarm.hiveeyes.org
requesting URL: https://swarm.hiveeyes.org/grafana/render/d-solo/OvnLNPqiz/statista-stockubersicht-and-bienenwetter-testvolk-zk-u?panelId=23&orgId=2&from=1546297200000&to=1577833199999&var-beekeeper=hiveeyes_open_hive_test_statista&var-sensors=All&var-COMMON_CDC_NAME=Berlin-Tegel&var-COMMON_MOSMIX_NAME=BERLIN-TEGEL&var-STATION=Berlin-Tegel&theme=light&width=100&height=100&tz=Europe%2FBerlinstatista-stockubersicht-and-bienenwetter-testvolk-zk-u.PNG
request sent
HTTP/1.1 200 OK
headers received
loaded in 4457 ms
decodeGuru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
Core 1 register dump:
PC : 0x400d3cf2 PS : 0x00060c30 A0 : 0x800d3ede A1 : 0x3ffb1da0
A2 : 0x00000000 A3 : 0x5e5d859c A4 : 0x5e5d859c A5 : 0x3ffc5048
A6 : 0x3ffb1d5c A7 : 0x3ffb1d5c A8 : 0x00000089 A9 : 0x0003d032
A10 : 0x3ffba794 A11 : 0x3ffb1d5c A12 : 0x00000008 A13 : 0x3ffb1da0
A14 : 0x3ffb1d20 A15 : 0x00000008 SAR : 0x0000000a EXCCAUSE: 0x0000001c
EXCVADDR: 0x0003d032 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Backtrace: 0x400d3cf2:0x3ffb1da0 0x400d3edb:0x3ffb1dc0 0x400d1edf:0x3ffb1e20 0x400d20a0:0x3ffb1ee0 0x400d20e8:0x3ffb1f20 0x400d231f:0x3ffb1f50 0x400d7907:0x3ffb1fb0 0x40088b9d:0x3ffb1fd0
Rebooting...
wenn ich das ganze nicht als char sondern als String lade kann ich es zwar nicht an uPNG übergeben aber per Serial ausgeben.
Die erste Zeile kommt mir verdächtig vor, habe ich da was vom http header übersehen?
rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:1216
ho 0 tail 12 room 4
load:0x40078000,len:9720
ho 0 tail 12 room 4
load:0x40080400,len:6364
entry 0x400806b8
␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀␀
WiFi.getAutoConnect()=0
WiFi.SSID()=
Connecting to FRITZ!Box 7490
.3
WiFi connected
192.168.178.175
downloading file "statista-stockubersicht-and-bienenwetter-testvolk-zk-u.PNG"
connecting to swarm.hiveeyes.org
requesting URL: https://swarm.hiveeyes.org/grafana/render/d-solo/OvnLNPqiz/statista-stockubersicht-and-bienenwetter-testvolk-zk-u?panelId=23&orgId=2&from=1546297200000&to=1577833199999&var-beekeeper=hiveeyes_open_hive_test_statista&var-sensors=All&var-COMMON_CDC_NAME=Berlin-Tegel&var-COMMON_MOSMIX_NAME=BERLIN-TEGEL&var-STATION=Berlin-Tegel&theme=light&width=100&height=100&tz=Europe%2FBerlinstatista-stockubersicht-and-bienenwetter-testvolk-zk-u.PNG
request sent
HTTP/1.1 200 OK
headers received
client disconnected.
Data from server captured in readString:
�PNG
␚
IHDR␀␀␀d␀␀␀␆␀␀␀p�T␀␀␀␁sRGB␀��␜�␀␀␇�IDATx���␡P��␁��o�␐ (BTT@��$"�U춮��UtWO�j�,Ȝ?␐������v�����uW�2�@␑␄�[�F���ۦ��u���V � �N␂␚␂ �w␡�␙␘�і��|>␡yo��y������W���jww/�␞␏���*
:�␖��ݣ�␘b�*
�␖>@SS␓]].̦␄?␟���{�Ws�PWgc��Utuvq�H9Z�Bz�Zv��.�ť4]�®�/␐␝␝�a��m�[�����R\.7�}6��8��íџ�␐Fxx8�j�␀\�XC@@␀_z�␋TW��!��}g��xcͯA.��q�B5␙␙ϰ4�q␀�␛␛����␖�1��� ␔E�l6␁␐␜␜���p␀�z�(␎G␇iϬ!22␒�g�pk��hJ�le␕␞���j␋&��␅␋>��N�KG�␓��␎EQ�����␙�_����␃P\\Fqqـל�N���␆ݷ��2���c6�X�,u��0␙��w�␟4^n�b�!u�c$%�␅�b���j%&&␚�>p�␟t␔�5��[�7f�\��␂␃'��pKoo/����j�l����7����wc?u�4v{␛���L�2����p��E��␛x�+_␞����_�DEE␁��j�h�I��ݸ\.�Z-␀␚��␗���Zm�_�άY�␆�v�����ߜ9␎␎���2yr0qq�␀̛�ĉ␓'q�����␁~␎b4&���ğ�r␜�$␝s�"9~�$AAA|␡�␋␀�␙Bq:;y�c␜��dm�ġ���V��쭙�z���-k���␜,=ĉ␓'���!)�Lƺ��l���R���%␎␟)'>.␎��Foo/v{␛�w��[�t �֭�␙?#|ưk��dJ��␏>$9y�w��lB��␒c�4␃��-��������t��U������r����3��
@���␞�_G�A�S��O␄2�`d␐�� ��A␄#F␆␑�␌"␘␙D02�`d␐�� ��A␄#F␆␑�␌"␘␙D02�`d␐�� ��A␄#F␆␑�␌"␘a�l����␙�D� #UXx���\��␟k␓>��␛����hp�\��␜�LE%z��G␞y�����-Y�␇<sX������b��<�9~�Ý␀B���x���␖<␞␏7nܠ���UO.gf�L��n��n<��+�;�␏7�X␓���͙�lڸ�␇␟L��蠸����␡��0␡�}|+#��Щ����shoo�7��������/�o�7�bŊ'|�O�␚2�����e�OW��xD*�␂��x?a�Ld����x�:���)1�:e73�3F��𗬉�␡␌␀����*�s������AF���: �m6��␝��F␔E^�F���ʎ��ެ␝tL�X^␡�l��A␆␑��d F␆␑�␌"␘␙D02�`d␐�� ��A␄#F␆␑�␌"␘␙D02�`d␐�� ��A␄#F␆␑�␌"␘␙D02�`d␐�� ��A␄#F␆␑�␌"␘␙D02�`d␐�� ��A␄#F␆␑�␌"␘␙D02�`d␐�(ȇ�š��Q4����2�EUUPA�h�/�('␌���␑␀␀␀␀IEND�B`�
End of readString
==================
loaded in 6285 ms
bitmap format not handled.
_PowerOn : 34999
_Update_Full : 1518001
_PowerOff : 19001
GxEPD2_WiFi_Example done
Die WSL kann leider überhaupt nichts anzeigen, da fehlt der X-Server. Da brauchst Du entweder einen anderen Rechner mit X-Server oder Du wartest - das Feature ist für die WSL angekündigt.
pillow install läuft bei mir - ganz normal in CMD:
Microsoft Windows [Version 10.0.18363.836]
(c) 2019 Microsoft Corporation. Alle Rechte vorbehalten.
C:\Users\Markus>pip install pillow
Collecting pillow
Downloading Pillow-7.1.2-cp38-cp38-win32.whl (1.8 MB)
|████████████████████████████████| 1.8 MB 242 kB/s
Installing collected packages: pillow
Successfully installed pillow-7.1.2
Ah… bei Dir Win32 und bei mir win64.
Kann man bei win10 64 ein 32bit pillow erzwingen und installieren?
Ich hab Win10 64, aber nichts eingestellt. Das hat einfach so funktioniert.
hat bei mir jetzt aber auch geklappt mit
pip3 install imagecast
hatte das hier übersehen und Python 2 ist als default eingestellt.
Collecting Pillow==7.1.2 (from imagecast)
Downloading https://files.pythonhosted.org/packages/91/9e/1b45eed618c35010d8cc3ba57f12baf09af37054665b7cdf79aafa93ed75/Pillow-7.1.2-cp38-cp38-win_amd64.whl (2.0MB)
|████████████████████████████████| 2.0MB 3.2MB/s
allerdings hapert es jetzt an anderer Stelle. Python und Windows sind echt eine Kunst für sich.
Ich Setze Python mal komplett neu auf.
Habe gesehen das ich mittlerweile x Versionen drauf habe und auch das der Installationspath der Scripte zu lang ist und der path auch nirgens eingetragen ist.
Grummel…
[EDIT]
jetzt klappt es allerdings bekomme ich den “Service” nicht gestartet
Das Problem ist nicht Windows und Python sondern Python.
Dafür gibt es aber eine Lösung: virtualenv. Da gibt es vermutlich 10 Millionen Turorials, hier ist eins davon:
Bei dem Problem mit dem Service kann ich leider nicht helfen.
Wie gesagt hab es hoffe ich ohne hin bekommen
@poesel läuft es bei Dir als service API denn unter Windows, sonnst muß ich nochmal schauen dann spinnt bei mir immer noch etwas.
Das ist doch schonmal was! Kannst Du vielleicht den Code mit uns teilen - selbst wenn er noch nicht 100%ig funktioniert. Vielleicht bringt es was, wenn ich aus der Ferne mal drauf schaue. Wichtig wäre v.a., dass er kompiliert.
Der war entgegen der Dokumentation noch nicht implementiert. Mea culpa.
Jetzt aber: http://imagecast.hiveeyes.org/. Beispiele:
Hi Michael,
upng_new_from_bytes
will einen Pointer auf einen C-style buffer:
Die c_str()
-Methode der Arduino String
-Implementierung liefert Dir einen solchen, siehe Arduino > String > Functions > C str.
Es könnte also so in der Art klappen:
upng_t* upng;
HTTPClient http;
http.begin(client, server, 80, uri);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
upng = upng_new_from_bytes(payload.c_str(), payload.length());
}
if (upng != NULL) {
// Decode PNG image.
upng_decode(upng);
if (upng_get_error(upng) == UPNG_EOK) {
// Get pointer to bitmap buffer.
const uint8_t *bitmap = upng_get_buffer(upng);
// Display bitmap on e-Paper.
//display.fillScreen(GxEPD_WHITE);
display.writeScreenBuffer(); // use default for white
display.drawImage(bitmap, 0, 0, 200, 200, false, false, true);
//display.writeImage(bitmap, 0, 0, 200, 200, false, false, true);
display.refresh(true);
}
upng_free(upng);
}
– Unfinished spike to load PNG via HTTP and display on e-Paper display with ESP32 · GitHub
Viele Grüße,
Andreas.
Leider auch keine Chance.
readString = client.readString(); //gets byte from ethernet buffer
upng = upng_new_from_bytes(readString.c_str(), png_length);
Ergebnis:
test.ino:141:48: error: invalid conversion from 'const char*' to 'const unsigned char*' [-fpermissive]
upng = upng_new_from_bytes(payload.c_str(), payload.length());
^
Hab noch eine Idee, aber es geht erst morgen Abend weiter.
Hat sonnst noch jemand Ideen man braucht ja nicht unbedingt ein Display, um den Stream in einen buffer zu laden und an den decoder weiter zu geben.