Lolin32 mit SD (SD_MMC) und PN5180 als RFID-Leser

Ich habe einen PR erstellt.

1 „Gefällt mir“

Perfekt. Klappt!
Danke.

Hallo zusammen,

ich habe die Platine („Lolin32 mit SD (SD_MMC) und PN5180 als RFID-Leser“) nun in der Box meines Sohnes in Betrieb genommen. Die höhere Empfindlichkeit des PN5180 macht sich sehr gut, da die Box aus recht dickem Multiplex besteht (ich glaube 6 mm) und der MFRC522 oft nicht sofort reagierte (und ich keine Lust hatte mit der Oberfräse Material für den Leser rauszufräsen).

Zwei Fragen habe ich:

  1. Wenn ich die RFID Karte auf der Box liegen lasse, dann läuft die Musik für einige Minuten (gefühlt so 3 min) einwandfrei, und startet dann von vorne. Das Verhalten tritt sowohl mit einem alten Softwarestand (Mitte April), also auch mit dem aktuellen Master sowie dem Refactoring Branch auf. Das Problem scheint nicht aufzutreten, wenn ich die Karte nach dem Erkennen wieder entferne. (Edit: Die Box scheint nicht neu zu starten, sondern die Karte wird ein weiteres mal erkannt, und erwirkt damit ein erneutes Abspielen des ganzen Ordners.)
  2. Das Aufwecken mittels RFID Karte klappt mit dem Master Branch, aber nicht mit dem Refactoring Branch. Ist das ein bekanntes Problem, oder stimmt bei mir etwas nicht?

Viele Grüße
Johannes

Ich wundere mich . Mein RC522 funktioniert immer noch wenn ich die Box unter meine Schreibtischplatte halte , das sind insgesamt 5mm Frontplatte Sperrholz + 25 mm Kiefer massiv .

Also auf Basis meiner ganzen Tests kann ich auf jeden Fall sagen, dass der PN5180 hinsichtlich seiner Reichweite dem 522 deutlich überlegen ist. Er kostet halt mehr, er braucht mehr GPIOs und man kriegt ihn halt nur in China. Normalerweise teste ich ja immer auf irgendwelchen PCBs und nicht in geschlossenen Gehäusen. Jedoch haben meine beiden Kinder ESPuinos hier stehen. Und da ist es jetzt so, dass der ESPuino meines Sohnemanns deutlich größer ist als der ESPuino meiner Tochter. Und Letztgenanntes hatte halt zur Folge, dass es echt eng geworden ist im Gehäuse und die Ordnung ein bisschen gelitten hat. Und während der RC522 beim Sohnemann noch ok performt hat, war das im kleineren Gehäuse echt schlecht. Mit dem PN5180 konnte ich das retten. Ich glaube (wissen tue ich es nicht), dass es dem PN5180 deutlich weniger ausmacht, wenn irgendwelcher Metallkram in der Nähe ist. Von daher denke ich, dass es von der Holzdicke alleine nicht so ultimativ abhängt.

@jpellenz

  1. Ich muss zugeben, dass ich ne Karte nie habe so lange liegen lassen. Muss ich mal testen.
  2. Hier muss ich mir wohl mal ein Testsystem bauen. Ich habe aktuell keines hier und es ergo auch noch nicht getestet.

@jpellenz Meine Vermutung ist, dass es zwischendrin mal zu einem Event kommt, wo die Karte kurz nicht erkannt wird. Und das führt dann dazu, dass im nächsten Zyklus ein Neuauflegen interpretiert wird. Vermutlich muss ich einen Zeitstempel mitspeichern, so dass ich solch kurze Events einfach „übersehen“ kann.
Bei meinem offenen Aufbau hier kann ich es auf jeden Fall nicht nachstellen, aber da liegt die Karte halt auch direkt auf dem Reader drauf. Aber auch im ESPuino meiner Tochter lässt sich das nicht nachstellen.

Mach’ bitte mal Folgendes:

Dort unterhalb der markierten Zeile (innerhalb des for-Anweisungsblockes!) z.B. sowas eintragen:
Serial.println("No card detected!");

So lange keine Karte aufgelegt wird, wird dieses Event ganz oft geworfen. Wenn eine Karte aufgelegt wird, dann nicht mehr. Und die Frage ist jetzt, ob dieses Event zwischendrin mal geworfen wird, wenn die Karte noch aufliegt.

Hallo Torsten,

Du hast recht - das scheint die Ursache zu sein - siehe unten. Immer in Paketen von vier Zeilen kommt die Meldung „***** No card detected! *****“
Dahinter habe ich noch den Zeitstempel ausgegeben (millis()).

Ich weiß, es gab schon mal die Diskussion über den Umgang mit vom System gemeldeten identischen Karten-Nummern. Ich glaube je nach Kontext ist ein unterschiedlicher Umgang sinnvoll. Also beim Anlernen ist ein zweites Mal die gleiche Kartennummer sinnvoll (für den Test der Karte); beim Abspielen aber eher nicht (wie hier in dem Fall).

Viele Grüße und danke für den Hinweis schon mal.

Viele Grüße
Johannes

Rebooting...
Restored maximum inactivity-time from NVS.: 10
Restoring initial LED-brightness from NVS: 16
Restored LED-brightness for nightmode from NVS: 2

 _____   ____    ____            _                 
| ____| / ___|  |  _ \   _   _  (_)  _ __     ___  
|  _|   \__  \  | |_) | | | | | | | | '_ \   / _ \
| |___   ___) | |  __/  | |_| | | | | | | | | (_) |
|_____| |____/  |_|      \__,_| |_| |_| |_|  \___/ 
Rfid-controlled musicplayer

Rev 20210630-2

Wakeup was not caused by deep sleep: 0
...
Restored lower voltage-level for Neopixel-display from NVS: 3.00 V
Restored upper voltage-level for Neopixel-display from NVS: 4.20 V
Restored battery-voltage-level for warning via Neopixel from NVS: 3.40 V
Restored interval of battery-measurement or Neopixel-display from NVS: 10 Minuten
Restored hostname from NVS: espuino3
.Current IP: 192.168.178.185
Free heap after setup: 127356
PSRAM: 0 bytes
Flash-size: 4194304 bytes
Firmware version=4.1
RFID-tags can now be applied...
Trying to connect to MQTT-broker ...
Try to connect to MQTT-server with user und password
New volume received via queue: 3
MQTT-connection established.
RFID-tag detected: 15-b3-33-28
RFID-tag received: 021179051040
Playlist-generation: cached
Free memory: 91624
Number of valid files: 21
Mode: all tracks (in alph. order) of directory '/Music/Compilations/albumtitle' 
New playlist received with 21 track(s)
Free heap: 90588
info        : PSRAM not found, inputBufferSize: 6399 bytes
info        : buffers freed, free Heap: 82572 bytes
info        : Reading file: "..."
...
info        : Audio-Length: 2712266
info        : syncword found at pos 0
info        : Channels: 2
info        : SampleRate: 44100
info        : BitsPerSample: 16
info        : BitRate: 192000
MQTT-message received: [Topic: Cmnd/ESPuino/Loudness] [Command: 3]
New volume received via queue: 3
MQTT-message received: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 16]
MQTT-message received: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 0]
MQTT-message received: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 16]
Current battery-voltage: 3.95 V
***** No card detected! ***** at 29595
***** No card detected! ***** at 29595
***** No card detected! ***** at 29595
***** No card detected! ***** at 29597
RFID-tag detected: 15-b3-33-28
RFID-tag received: 021179051040
Playlist-generation: cached
Free memory: 65628
Releasing memory of old playlist.
Free memory after cleaning: 67980
Number of valid files: 21
Mode: all tracks (in alph. order) of directory '/Music/Compilations/albumtitle' 
New playlist received with 21 track(s)
Free heap: 67436
info        : buffers freed, free Heap: 90788 bytes
info        : Reading file: "..."
...
info        : Audio-Length: 2712266
info        : syncword found at pos 0
info        : Channels: 2
info        : SampleRate: 44100
info        : BitsPerSample: 16
info        : BitRate: 192000
***** No card detected! ***** at 43690
***** No card detected! ***** at 43690
***** No card detected! ***** at 43690
***** No card detected! ***** at 43692
RFID-tag detected: 15-b3-33-28
RFID-tag received: 021179051040
Playlist-generation: cached
Free memory: 65536
Releasing memory of old playlist.
Free memory after cleaning: 67876
Number of valid files: 21
Mode: all tracks (in alph. order) of directory '/Music/Compilations/albumtitle' 
New playlist received with 21 track(s)
Free heap: 67320
info        : buffers freed, free Heap: 90684 bytes
info        : Reading file: "..."
...
info        : Audio-Length: 2712266
info        : syncword found at pos 0
info        : Channels: 2
info        : SampleRate: 44100
info        : BitsPerSample: 16
info        : BitRate: 192000
```

Ok. Vier Stück sind es auf jeden Fall, weil an der Stelle ein Array mit vier Elementen durchlaufen wird. Ist auf jeden Fall ein Event.

Ich habe eben mal ein Commit gemacht.

Lasse das bei dir mal laufen und setze das println-Statement über die if-Zeile, die ich markiert habe. Wenn das Event nun angezeigt wird (nur noch einfach, weil nicht mehr in der for-Schleife) und sich der ESPuino jedoch nicht verhält, als ob eine neue Karte aufgelegt wird, dann greift mein Fix. Wenn das nicht klappt, dann versuche mal, die 300 bis auf 500 oder so zu verlängern.
Ich kann es hier halt nicht nachstellen - sonst würde ich es selbst machen :slight_smile:

Nachtrag: Ich habe eben nochmal einen Commit gemacht. Die Subtraktion aus o.g. Code-Fragment war natürlich falsch rum :clown_face:.

Hallo Torsten,

danke für die Updates. Leider klappt es noch nicht. Das IF wird nicht betreten (ich habe die Schwelle auf 1000 ms erhöht), jedoch startet die Playlist dennoch von vorne (der State geht auf 4 == RFID_PN5180_NFC15693_STATE_RESET).

           } else {
                // Reset to dummy-value if no card is there
                // Necessary to differentiate between "card is still applied" and "card is re-applied again after removal"
                // lastTimeDetected14443 is used to prevent "new card detection with old card" with single events where no card was detected
                Serial.print("*** No card detected! *** at time ");
                Serial.println(millis());
                Serial.print("*** Last seen at time ");
                Serial.println(lastTimeDetected14443);
                if (!lastTimeDetected14443 || (millis() - lastTimeDetected14443 >= 1000)) {
                    Serial.println("*** No card detected timeout exeeded *** at time ");
                    Serial.println(millis());
                    lastTimeDetected14443 = 0;
                    for (uint8_t i=0; i<cardIdSize; i++) {
                        lastCardId[i] = 0;
                    }
                }

gibt folgende Ausgabe (mit der Ausgabe des States am Anfang von Rfid_Read):

*** In Rfid_Read with state 3
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
*** No card detected! *** at time 71221
*** Last seen at time 70884
*** In Rfid_Read with state 4
*** In Rfid_Read with state 5
*** In Rfid_Read with state 6
*** In Rfid_Read with state 7
*** In Rfid_Read with state 1
*** In Rfid_Read with state 2
*** In Rfid_Read with state 3
RFID-Karte erkannt: 15-b3-33-28
RFID-Karte empfangen: 021179051040
Playlist-Generierung: cached
Freier Speicher: 65532
Gebe Speicher der alten Playlist frei.
Freier Speicher nach Aufräumen: 67876
Anzahl gültiger Files: 21

Kein Stress - ich kann das auch später mal selbst debuggen. Gibt es da eigentlich in Visual Studio Code eine bessere Möglichkeit als Serial.print?

Grüße
Johannes

Grundsätzlich geht das mit dem Debuggen via jtag schon. Das Problem ist halt nur, dass man dafür gpios braucht. Und die sind halt nicht frei.

Zum Code: Vielleicht muss man, wenn man den ersten Event „keine Karte“ bekommt, die State-Machine wieder auf 3 setzen.

Nachtrag: Ich denke das Problem liegt darin, dass wenn einmal „No card“ kommt, die State-Machine dann runter in die NFC15693-Behandlung geht. Und dort wird dann, weil keine Karte erkannt wird, lastCardId auf einen Dummy-Wert gesetzt. Anschließend kommt dann wieder NFC14443 und dort wird die Karte wieder erkannt. Da die NFC15693-Behandlung jedoch vorher den Dummy-Wert gesetzt hat, unterscheiden sich die IDs und es wird damit eine neue Karte erkannt. Kurzum: Denke mein Ansatz war schon gut, wird jedoch ausgehebelt. Glaube meine Vermutung ist nicht so schlecht, dass man im ersten Event „keine Karte“ die State-Machine nochmal zurücksetzt. Vielleicht (aus der Hüfte geschossen!) so:

            if (!lastTimeDetected14443 || (millis() - lastTimeDetected14443 >= 400)) {
                lastTimeDetected14443 = 0;
                for (uint8_t i=0; i<cardIdSize; i++) {
                    lastCardId[i] = 0;
                }
            } else {
                stateMachine = RFID_PN5180_NFC14443_STATE_ACTIVE;
            }

Je kürzer man die Zeit (anstelle 400) machen kann, desto besser.

1 „Gefällt mir“

Top, das Neusetzen der state machine im else-Zweig hatte noch gefehlt. Jetzt läuft es wie erwartet durch. Und kurzes Wegnehmen und Neuauflegen startet das Album neu.

Die deltas liegen bei mir zw. 290 und 320 ms, so dass ich bei den 400 ms bleibe.

Vielen Dank und viele Grüße
Johannes

1 „Gefällt mir“

Ok, danke für deine Rückmeldung.
Habe das eben eingecheckt.

Hallo,

mit den ISO-14443 Karten klappt es nun ja hervorragend. Diese Karten setze ich hier normalerweise ein.

Jetzt habe ich es mal mit einer ISO-15693 Karte getestet. Beim Liegenlassen der Karte (mit einem zwei Tage alten Software-Stand, refactoring branch) startete das Album immer wieder von vorne:

*** Rfid_Read *** in state 1
*** Rfid_Read *** in state 2
*** Rfid_Read *** in state 3
*** Rfid_Read *** in state 4
*** Rfid_Read *** in state 5
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
RFID-Karte erkannt: 53-75-32-0a
RFID-Karte empfangen: 083117050010
Playlist-Generierung: cached
Freier Speicher: 64268
Gebe Speicher der alten Playlist frei.
Freier Speicher nach Aufräumen: 66464
Anzahl gültiger Files: 26
Modus: Hoerspiel
*** Rfid_Read *** in state 4
Neue Playlist empfangen mit 26 Titel(n)
Free heap: 65824
info        : buffers freed, free Heap: 89164 bytes
info        : Reading file: "/Audiobooks/artist/album/01_Track_01.mp3"
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 0]
info        : MP3Decoder has been initialized, free Heap: 67160 bytes
*** Rfid_Read *** in state 5
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 16]
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
'/Audiobooks/artist/album/01_Track_01.mp3' wird abgespielt (1 von 26)
info        : stream ready
...
info        : BitRate: 128000
*** Rfid_Read *** in state 1
*** Rfid_Read *** in state 2
*** Rfid_Read *** in state 3
*** Rfid_Read *** in state 4
*** Rfid_Read *** in state 5
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
RFID-Karte erkannt: 53-75-32-0a
RFID-Karte empfangen: 083117050010
Playlist-Generierung: cached
Freier Speicher: 64148
Gebe Speicher der alten Playlist frei.
Freier Speicher nach Aufräumen: 66340
Anzahl gültiger Files: 26
Modus: Hoerspiel
*** Rfid_Read *** in state 4
Neue Playlist empfangen mit 26 Titel(n)
Free heap: 65704
info        : buffers freed, free Heap: 89044 bytes
info        : Reading file: "/Audiobooks/artist/album/01_Track_01.mp3"
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 0]
info        : MP3Decoder has been initialized, free Heap: 67036 bytes
*** Rfid_Read *** in state 5
MQTT-Nachricht empfangen: [Topic: Cmnd/ESPuino/LedBrightness] [Command: 16]
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
'/Audiobooks/artist/album/01_Track_01.mp3' wird abgespielt (1 von 26)
info        : stream ready
...
info        : BitRate: 128000
*** Rfid_Read *** in state 1
*** Rfid_Read *** in state 2
*** Rfid_Read *** in state 3
*** Rfid_Read *** in state 4
*** Rfid_Read *** in state 5
*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
RFID-Karte erkannt: 53-75-32-0a

Heute nach git pull startet der ESP beim Auflegen der Karte ständig neu. (Kann aber auch unabhängig von der Kartenart sein und daran liegen, dass es ein Hörbuch ist und bei Track 5 gestartet werden soll. Über die Weboberfläche lasst sich der Track allerdings abspielen):

*** Rfid_Read *** in state 6
*** Rfid_Read *** in state 7
'/Audiobooks/artist/album/05_Track_05.mp3' wird abgespielt (5 von 26)
*** Rfid_Read *** in state 1
info        : stream ready
info        : Content-Length: 1523430
info        : file has no mp3 tag, skip metadata
info        : Audio-Length: 1523430
info        : syncword found at pos 1
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 52
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 43
info        : syncword found at pos 0
info        : MP3 decode error -6 : INVALID_FRAMEHEADER
info        : syncword found at pos 13
info        : syncword found at pos 0
info        : MP3 decode error -9 : INVALID_HUFFCODES
info        : syncword found at pos 94
info        : syncword found at pos 0
info        : MP3 decode error -9 : INVALID_HUFFCODES
info        : syncword found at pos 141
info        : syncword found at pos 0
E (108739) I2S: clkmdiv is too large

info        : Channels: 0
info        : SampleRate: 0
info        : BitsPerSample: 16
info        : BitRate: N/A
Guru Meditation Error: Core  1 panic'ed (IntegerDivideByZero). Exception was unhandled.
Core 1 register dump:
PC      : 0x400e6e57  PS      : 0x00060d30  A0      : 0x800e71b8  A1      : 0x3ffdc0f0  
A2      : 0x3ffc4c94  A3      : 0x3ffc7094  A4      : 0x000001f8  A5      : 0x00000000  
A6      : 0x3ffc5094  A7      : 0x3ffc7194  A8      : 0x800e6e54  A9      : 0x3ffdc0d0  
A10     : 0x00000000  A11     : 0x3ffc5094  A12     : 0x400d45a0  A13     : 0x00000000  
A14     : 0x3ffc5094  A15     : 0x00000000  SAR     : 0x00000004  EXCCAUSE: 0x00000006  
EXCVADDR: 0x00000000  LBEG    : 0x400014fd  LEND    : 0x4000150d  LCOUNT  : 0xffffffff  

ELF file SHA256: 0000000000000000

Backtrace: 0x400e6e57:0x3ffdc0f0 0x400e71b5:0x3ffdc130 0x400ea0d9:0x3ffdc160 0x400d3f09:0x3ffdc180 0x40092cfa:0x3ffdc2c0

Rebooting...

Irgendwelche Ideen, woran das liegen kann?

Edit: Das Problem mit dem Neustart lag wohl an der im NVS gespeicherten Abspielposition. Diese habe ich recht umständlich zurückgesetzt, indem ich hier:

den Wert für gPlayProperties.startAtFilePos im Code auf 0 gesetzt habe. Nach einmen erneuten Nutzen der Karte mit ordentlichem Beenden (zum Abspeichern einer neuen Position) war die Karte wieder zu nutzen. Gibt es da eine elegantere Variante, einen defekten Wert loszuwerden, ohne Codeänderung und neu flashen? (Der Import einer korrigierten Version der Backup.txt hat nicht funktioniert, da glaube ich bestehende Einträge nicht angefasst werden.)

Grüße
Johannes

Also was mir irgendwie auffällt ist, dass die Statemachine offenbar immer wieder bei 1 anfängt. Das ist für ISO-14443 ok, aber für ISO-15693 nicht. Hintergrund ist, dass ich, wenn ISO-14443 aktiv ist, nur die zugehörigen States durchlaufen will und nicht die für ISO-15693. Und umgekehrt gilt natürlich das Gleiche. Ergo dürften, wenn ISO-15693 aktiv ist, auch nur die States 4 bis 7 durchlaufen werden.

Ich vermute mal, dass der Grund dafür Folgendes ist:

if (memcmp((const void *)cardId, (const void *)lastCardId, sizeof(cardId)) == 0) {
                // reset state machine
                stateMachine = RFID_PN5180_NFC14443_STATE_RESET;
                return;
}

Vielleicht klappt es, wenn man das durch

if (memcmp((const void *)cardId, (const void *)lastCardId, sizeof(cardId)) == 0) {
	if (stateMachine == RFID_PN5180_NFC14443_STATE_ACTIVE) {
		stateMachine = RFID_PN5180_NFC14443_STATE_RESET;
		return;
	} else if (stateMachine == RFID_PN5180_NFC15693_STATE_ACTIVE) {
		stateMachine = RFID_PN5180_NFC15693_STATE_RESET;
		return;
	}
}

ersetzt. Ist aber gut möglich, dass das noch nicht reicht. Müsste ich mich tiefer reindenken und es am besten auch testen.

Ich muss gerade mal blöd fragen: Hast du eine Toniefigur verwendet oder wird bei den PN5180 auch direkt ein NFC15693 mitgeliefert? Hab’s noch nie getestet wenn ich ehrlich bin. Sind ja immer zwei dabei in der Packung (Karte und Schlüsselanhänger). Weil ich hätte sonst gar keinen NFC dafür hier.

Refactoring ist auf jeden Fall gut. Am Master-Branch habe ich schon lange keine Änderungen mehr diesbzgl. durchgeführt.

Ich habe meine dem Reader beiliegenden Tags mal am Handy mit der TagInfo App gecheckt, es wurden mir alle als ISO14443 gezeigt. Konnte daher auch nur mit einer Toniefigur testen :confused: Er kommt bei mir allerdings auch nie über RFID_PN5180_NFC15693_STATE_GETINVENTORY hinaus (meldet immer rc = -1).

In deinem Code solltest du die if Statements noch von = auf == ändern.

Hast du da ein Beispiel?

In deinem Snippet oben machst du ein Assignment ( = stateMachine) statt einer Evaluation ( == stateMachine).

            if (memcmp((const void *)cardId, (const void *)lastCardId, sizeof(cardId)) == 0) {
                // reset state machine
                if (RFID_PN5180_NFC14443_STATE_ACTIVE == stateMachine) {
                    stateMachine = RFID_PN5180_NFC14443_STATE_RESET;
                    return;
                } else if (RFID_PN5180_NFC15693_STATE_ACTIVE == stateMachine) {
                    stateMachine = RFID_PN5180_NFC15693_STATE_RESET;
                    return;
                }
            }
2 „Gefällt mir“

Danke. Was wäre ich nur ohne die Compilerwarnungen?! :joy:
Glaub ich muss mir mal ne Toniefigur ausleihen. Sonst komme ich da nicht weiter. Oder @tueddy muss ran :slight_smile:

Die Figuren gibt es u.a. in einigen Bibliotheken. Ich habe bisher leider den Debug-Modus der angepassten PN5180 Library von @tueddy nicht zum Laufen bekommen. Der Linker scheitert mit collect2.exe: error: ld returned 1 exit status und diversen undefined reference Notices).

Ich glaube aber inzwischen fast, dass mein Reader defekt ist. Wird sich zeigen, wenn ich den espuino auf Platine umbaue :see_no_evil: