# IoT-Projekt (Eingangskontrolle)

für IoT-Projekt 2026

# Camera Erkennung

# Links für Raspberry Pi einrichtung

Benutztes Modell: Yolo 26n

[Installationsanleitung](https://docs.ultralytics.com/quickstart/)

Benötigte Applications:

[Pytorch](https://www.ultralytics.com/glossary/pytorch)

[Ultralytics](https://pypi.org/project/ultralytics/#files)

Python Version 3.8 oder Älter

# Verläufiger Code für die Kameraerkennung mit mqtt übertragung

<div id="bkmrk-import-cv2-import-pa" style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #859900;">Code erstellt/angepasst mit Perplexity/Claude</span></div><div></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ssl</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">math</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">paho</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">client</span><span style="color: #839496;"> </span><span style="color: #859900;">as</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">mqtt</span></div><div><span style="color: #859900;">from</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ultralytics</span><span style="color: #839496;"> </span><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Einstellungen ------------------</span></div>  
<div><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">r</span><span style="color: #dc322f;">"C:</span><span style="color: #cb4b16;">\\C</span><span style="color: #dc322f;">am</span><span style="color: #cb4b16;">\\y</span><span style="color: #dc322f;">olo26n.pt"</span></div><div><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div>  
<div><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">300</span><span style="color: #839496;">, </span><span style="color: #d33682;">400</span><span style="color: #839496;">)</span></div><div><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">200</span><span style="color: #839496;">, </span><span style="color: #d33682;">100</span><span style="color: #839496;">)</span></div><div><span style="color: #268bd2;">LINE\_BUFFER</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">30</span></div>  
<div><span style="color: #268bd2;">MIN\_MOVE\_PIXELS</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Logik-Variablen ------------------</span></div>  
<div><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span></div><div><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> {}</span></div><div><span style="color: #268bd2;">person\_states</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> {}</span></div><div><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">set</span><span style="color: #839496;">()</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hilfsfunktionen ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(px, py, x1, y1, x2, y2):</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> (x2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (py </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">-</span><span style="color: #839496;"> (y2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (px </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1)</span></div>  
  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">get\_zone</span><span style="color: #839496;">(px, py):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">val</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(px, py, </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">length</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">math</span><span style="color: #839496;">.</span><span style="color: #268bd2;">sqrt</span><span style="color: #839496;">((</span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\]</span><span style="color: #859900;">-</span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\])</span><span style="color: #859900;">\*\*</span><span style="color: #d33682;">2</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\]</span><span style="color: #859900;">-</span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span><span style="color: #859900;">\*\*</span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">dist</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">abs</span><span style="color: #839496;">(</span><span style="color: #268bd2;">val</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #268bd2;">length</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">dist</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_BUFFER</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"zone"</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">val</span><span style="color: #839496;"> </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"left"</span></div>  
  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(frame):</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">line</span><span style="color: #839496;">(frame, </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(frame, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"Raum: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #d33682;">10</span><span style="color: #839496;">, </span><span style="color: #d33682;">30</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">1</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hauptprogramm ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">():</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">global</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;">, </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">, </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">, </span><span style="color: #268bd2;">crossed\_ids</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span><span style="color: #839496;">(</span><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">Client</span><span style="color: #839496;">(callback\_api\_version</span><span style="color: #859900;">=</span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">CallbackAPIVersion</span><span style="color: #839496;">.</span><span style="color: #268bd2;">VERSION2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">username\_pw\_set</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"testuser"</span><span style="color: #839496;">, </span><span style="color: #2aa198;">"O#%~54{Kf{-c-7t"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">tls\_set</span><span style="color: #839496;">(tls\_version</span><span style="color: #859900;">=</span><span style="color: #cb4b16;">ssl</span><span style="color: #839496;">.</span><span style="color: #268bd2;">PROTOCOL\_TLS\_CLIENT</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">connect</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"5ea1e51a4f614745a394b1edd0259a6d.s1.eu.hivemq.cloud"</span><span style="color: #839496;">, </span><span style="color: #d33682;">8883</span><span style="color: #839496;">, </span><span style="color: #d33682;">60</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">loop\_start</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"Starte Kamera... Drücke 'q' zum Beenden"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;">.</span><span style="color: #268bd2;">track</span><span style="color: #839496;">(</span></div><div><span style="color: #839496;"> source</span><span style="color: #859900;">=</span><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> show</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> stream</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> persist</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> classes</span><span style="color: #859900;">=</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\],</span></div><div><span style="color: #839496;"> conf</span><span style="color: #859900;">=</span><span style="color: #d33682;">0.5</span><span style="color: #839496;">, </span><span style="color: #586e75; font-style: italic;">\# ← reduzierter Schwellwert</span></div><div><span style="color: #839496;"> verbose</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> ):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">frame</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">plot</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">len</span><span style="color: #839496;">(</span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">) </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">id</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">set</span><span style="color: #839496;">()</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">, </span><span style="color: #268bd2;">tid</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">zip</span><span style="color: #839496;">(</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">xyxy</span><span style="color: #839496;">, </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">(</span><span style="color: #268bd2;">tid</span><span style="color: #839496;">.</span><span style="color: #268bd2;">item</span><span style="color: #839496;">())</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span><span style="color: #839496;">.</span><span style="color: #268bd2;">add</span><span style="color: #839496;">(</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">x1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">.</span><span style="color: #268bd2;">tolist</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">x1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">y1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">y2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">circle</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">), </span><span style="color: #d33682;">4</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #859900;">-</span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">0.5</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">get\_zone</span><span style="color: #839496;">(</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">!=</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"zone"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\]</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">prev\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"left"</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;">) </span><span style="color: #859900;">or</span><span style="color: #839496;"> </span><span style="color: #dc322f;">\\</span></div><div><span style="color: #839496;"> (</span><span style="color: #268bd2;">prev\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"left"</span><span style="color: #839496;">):</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;">.</span><span style="color: #268bd2;">add</span><span style="color: #839496;">(</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">-=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> EXITED, Raum: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">publish</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"raum/personen"</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">,event=EXIT,raum=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">+=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> ENTERED, Raum: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">publish</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"raum/personen"</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">,event=ENTER,raum=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">!=</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"zone"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">gone\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">-=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">gone\_ids</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">gid</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> (</span><span style="color: #cb4b16;">set</span><span style="color: #839496;">(</span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">.</span><span style="color: #268bd2;">keys</span><span style="color: #839496;">()) </span><span style="color: #859900;">|</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">set</span><span style="color: #839496;">(</span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">.</span><span style="color: #268bd2;">keys</span><span style="color: #839496;">())) </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">.</span><span style="color: #268bd2;">pop</span><span style="color: #839496;">(</span><span style="color: #268bd2;">gid</span><span style="color: #839496;">, </span><span style="color: #b58900;">None</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">.</span><span style="color: #268bd2;">pop</span><span style="color: #839496;">(</span><span style="color: #268bd2;">gid</span><span style="color: #839496;">, </span><span style="color: #b58900;">None</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">imshow</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"YOLO Room Counter"</span><span style="color: #839496;">, </span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">waitKey</span><span style="color: #839496;">(</span><span style="color: #d33682;">1</span><span style="color: #839496;">) </span><span style="color: #859900;">&amp;</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">0x</span><span style="color: #d33682;">FF</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #268bd2;">ord</span><span style="color: #839496;">(</span><span style="color: #2aa198;">'q'</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">break</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">destroyAllWindows</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">loop\_stop</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">disconnect</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"</span><span style="color: #cb4b16;">\\n</span><span style="color: #2aa198;">Finale Zählerstände: Raum=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">\_\_name\_\_</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"\_\_main\_\_"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">()</span></div></div></div></div>

# Stabiler Code vor mqtt ergänzung

<div id="bkmrk-import-cv2-from-ultr" style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span></div><div><span style="color: #859900;">from</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ultralytics</span><span style="color: #839496;"> </span><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Einstellungen ------------------</span></div>  
<div><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">r</span><span style="color: #dc322f;">"C:</span><span style="color: #cb4b16;">\\C</span><span style="color: #dc322f;">am</span><span style="color: #cb4b16;">\\y</span><span style="color: #dc322f;">olo26n.pt"</span><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Pfad zu deinem .pt</span></div><div><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# 0 = Standard-Webcam</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# Linie (Türschwelle) im Bild anpassen!</span></div><div><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">300</span><span style="color: #839496;">, </span><span style="color: #d33682;">400</span><span style="color: #839496;">) </span><span style="color: #586e75; font-style: italic;">\# Punkt 1 (x1, y1)</span></div><div><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">200</span><span style="color: #839496;">, </span><span style="color: #d33682;">100</span><span style="color: #839496;">) </span><span style="color: #586e75; font-style: italic;">\# Punkt 2 (x2, y2)</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# Minimale Bewegung, damit ein Seitenwechsel gezählt wird</span></div><div><span style="color: #268bd2;">MIN\_MOVE\_PIXELS</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Logik-Variablen ------------------</span></div>  
<div><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span></div><div><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> {} </span><span style="color: #586e75; font-style: italic;">\# {track\_id: (x, y)}</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hilfsfunktionen ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(px, py, x1, y1, x2, y2):</span></div><div><span style="color: #839496;"> </span><span style="color: #2aa198;">"""</span></div><div><span style="color: #2aa198;"> Gibt das Vorzeichen der Punktlage relativ zur Linie zurück.</span></div><div><span style="color: #2aa198;"> &gt;0: eine Seite, &lt;0: andere Seite, 0: genau auf der Linie.</span></div><div><span style="color: #2aa198;"> """</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> (x2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (py </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">-</span><span style="color: #839496;"> (y2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (px </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1)</span></div>  
  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(frame):</span></div><div><span style="color: #839496;"> </span><span style="color: #2aa198;">"""Zähler und Linie ins Bild zeichnen."""</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">line</span><span style="color: #839496;">(frame, </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(frame, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"IN: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #d33682;">10</span><span style="color: #839496;">, </span><span style="color: #d33682;">30</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">1</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hauptprogramm ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">():</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">global</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;">, </span><span style="color: #268bd2;">last\_positions</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Modell laden</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span><span style="color: #839496;">(</span><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"Starte Kamera... Drücke 'q' zum Beenden"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Tracking-Loop</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;">.</span><span style="color: #268bd2;">track</span><span style="color: #839496;">(</span></div><div><span style="color: #839496;"> source</span><span style="color: #859900;">=</span><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> show</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> stream</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> persist</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> classes</span><span style="color: #859900;">=</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #586e75; font-style: italic;">\# nur "person"</span></div><div><span style="color: #839496;"> verbose</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> ):</span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Bild holen (mit eingezeichneten Boxen)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">frame</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">plot</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Boxen / Tracks auswerten</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">len</span><span style="color: #839496;">(</span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">) </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">id</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# WICHTIG: track\_ids kann None sein, wenn keine Tracks vorhanden</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">, </span><span style="color: #268bd2;">tid</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">zip</span><span style="color: #839496;">(</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">xyxy</span><span style="color: #839496;">, </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">(</span><span style="color: #268bd2;">tid</span><span style="color: #839496;">.</span><span style="color: #268bd2;">item</span><span style="color: #839496;">())</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">x1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">.</span><span style="color: #268bd2;">tolist</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">x1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">y1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">y2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Schwerpunkt einzeichnen</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">circle</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">), </span><span style="color: #d33682;">4</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #859900;">-</span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">0.5</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Vorherige Position holen</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">prev\_cy</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\]</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Nur auswerten, wenn sich die Person genug bewegt hat</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">dist\_sq</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">) </span><span style="color: #859900;">\*\*</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cy</span><span style="color: #839496;">) </span><span style="color: #859900;">\*\*</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">dist\_sq</span><span style="color: #839496;"> </span><span style="color: #859900;">&gt;=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">MIN\_MOVE\_PIXELS</span><span style="color: #839496;"> </span><span style="color: #859900;">\*\*</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Seite relativ zur Linie vorher / nachher</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(</span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">prev\_cy</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\],</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">curr\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\],</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Seitenwechsel -&gt; Linie überquert</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">\*</span><span style="color: #839496;"> </span><span style="color: #268bd2;">curr\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Richtung über y-Bewegung (an Kamera anpassen!)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">-=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Verhindert negativen Zähler</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> ENTERED, IN: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">+=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> EXITED, IN: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# aktuelle Position speichern</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Bild anzeigen</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">imshow</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"YOLO Room Counter"</span><span style="color: #839496;">, </span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Nur mit 'q' beenden</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">waitKey</span><span style="color: #839496;">(</span><span style="color: #d33682;">1</span><span style="color: #839496;">) </span><span style="color: #859900;">&amp;</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">0x</span><span style="color: #d33682;">FF</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #268bd2;">ord</span><span style="color: #839496;">(</span><span style="color: #2aa198;">'q'</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">break</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">destroyAllWindows</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"</span><span style="color: #cb4b16;">\\n</span><span style="color: #2aa198;">Finale Zählerstände: IN=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">\_\_name\_\_</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"\_\_main\_\_"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">()</span></div></div>

# Grundlagen + Infos

Wir verwenden für dieses Projekt das bereits trainierte Personenerkennungsmodul von Ultralytics "YOLO"  
Hierbei wird die neuste Version "yolo26n" benutzt.

Ultralytics hat hierfür bereits eine Python Library erstellt mit allen wichtigen Variablen und Funktionen bereits vordefiniert.

Das Personenerkennungsmodul ist als .pt (python torch) abgespeichert.

(

<div id="bkmrk-import-cv2-import-ss" style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ssl</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">paho</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">client</span><span style="color: #839496;"> </span><span style="color: #859900;">as</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">mqtt</span></div><div><span style="color: #859900;">from</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ultralytics</span><span style="color: #839496;"> </span><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span></div><div>)</div></div>

# LED Konfiguration

=&gt; Im Anhang liegen Dokumente für die Konfiguration.

**WICHTIG**: Voraussetzungen sind eine Tasmota geflashte ESP-32 und zusätzlich das ausgewählte Modul "**WS2812**" auf einen der Data-Pins der ESP-32! (In unserem Fall GPIO04).  
  
**ESP-32 Kabelverknüpfung:**  
Gehen wir davon aus, dass wir von oben auf die ESP-32 schauen und der USB-C Port nach unten schaut...  
  
**GND**: 1. Reihe, außen (auf dem rechten Pinbrett)  
**Data**: 6. Reihe, außen (auf dem rechten Pinbrett)  
**Voltage**: 8. Reihe innen (auf dem linken Pinbrett)  
  
Picture:

**Licht AN/AUS** Topic: cmnd/esp32-led/<span style="background-color: rgb(224, 62, 45); color: rgb(236, 240, 241);">POWER</span>  
Payload/Message: off **ODER** on

**Licht TOGGLEN** Topic: cmnd/esp32-led/<span style="background-color: rgb(224, 62, 45); color: rgb(236, 240, 241);">POWER</span>  
Payload/Message: toggle

**Licht steuern**  
Topic: cmnd/esp32-led/<span style="background-color: rgb(224, 62, 45);"><span style="color: rgb(236, 240, 241);">Led</span>  
<span style="background-color: rgb(255, 255, 255);">Payload/Message: &lt;RGB/Hex&gt; &lt;RGB/Hex&gt; etc...  
=&gt; Beispiel Payload/Message: 255,0,0 0,255,0 0,255,0  
(Ersten drei Lichter werden gesteuert)  
  
Um einzelne Lichter auszuschalten, setze Werte auf 0!  
=&gt; Beispiel Payload/Message: 0,0,0 **ODER** 000000 </span></span>

<span style="background-color: rgb(224, 62, 45);"><span style="background-color: rgb(255, 255, 255);">**Licht Übergang/Fade**  
Topic: cmnd/esp32-led/<span style="background-color: rgb(224, 62, 45); color: rgb(236, 240, 241);">Fade</span>  
Payload/Message: on **ODER** off  
=&gt; Lichter müssen anschließend erneut gesetzt werden, um Effekt zu sehen (Ändert nur Übergang zwischen Farben)  
  
**Licht Geschwindigkeit/Speed**  
Topic: <span style="background-color: rgb(224, 62, 45);"><span style="background-color: rgb(255, 255, 255);">cmnd/esp32-led/<span style="background-color: rgb(224, 62, 45); color: rgb(236, 240, 241);">SPEED</span>  
Message/Payload: Anzahl in Sekunden  
=&gt; Beispielsweise Message/Payload: 3  
(In 3 Sekunden werden die Lichter angezeigt)  
=&gt; Funktioniert nur mit Zusatzeffekten z.B Fade!</span></span></span></span>

<span style="background-color: rgb(224, 62, 45);"><span style="background-color: rgb(255, 255, 255);"><span style="background-color: rgb(224, 62, 45);"><span style="background-color: rgb(255, 255, 255);">**Alle Lichter steuern**  
Topic: cmnd/esp32-led/<span style="background-color: rgb(224, 62, 45); color: rgb(236, 240, 241);">Color  
</span></span></span></span></span><span style="color: rgb(236, 240, 241);"><span style="color: rgb(0, 0, 0);">Payload/Message: &lt;RGB/Hex&gt;  
=&gt; Besipiel Payload/Message: 0,255,0</span></span>

**MQTT Konfiguration des ESP-32:**

[![esp32-led-mqtt-konfiguration.jpg](https://wiki.floppaonly.de/uploads/images/gallery/2026-04/scaled-1680-/esp32-led-mqtt-konfiguration.jpg)](https://wiki.floppaonly.de/uploads/images/gallery/2026-04/esp32-led-mqtt-konfiguration.jpg)

# MQTT-Broker Kram

<span style="text-decoration: underline;">**HiveMQ Broker URL:**</span>

5ea1e51a4f614745a394b1edd0259a6d.s1.eu.hivemq.cloud

Port: 8883 Websocket-Port: 8884

<span style="text-decoration: underline;">**PERMISSON FÜR NUR SUB:**</span>

User: testuser

Passwort: O#%~54{Kf{-c-7t

<span style="text-decoration: underline;">**PERMISSION FÜR SUB+PUB:**</span>

User: backend\_nodered

Passwort: vzd)4S=5FZJ(U!5

<span style="text-decoration: underline;">**Für später und Doku, da wo wir offiziell hinwollen:**</span>

Die Kommunikation erfolgt verschlüsselt über MQTT TLS (Port 8883). Der Zugriff auf den Broker ist durch individuelle Benutzerkonten und rollenbasierte Topic-Berechtigungen abgesichert.

# Manuelles ESP-32 Flashen mit Tasmota über Windows Terminal

<span style="text-decoration: underline;">**Vorbereitung**  
</span>1. Downloade die passende Firmware für die ESP-32: (In unserem Fall die tasmota32.factory.bin)  
Link: [<span style="color: rgb(53, 152, 219);">https://ota.tasmota.com/tasmota32/</span>](https://ota.tasmota.com/tasmota32/)

2\. Sollte der USB Port, an der die ESP32 hängt, nicht erkannt werden, muss zusätlich der USB-Bridge Driver heruntergeladen werden  
Link: [https://www.silabs.com/software-and-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads](https://www.silabs.com/software-and-tools/usb-to-uart-bridge-vcp-drivers?tab=downloads)  
Downloade dann den *<span style="color: rgb(53, 152, 219);">**CP210x Universal Windows Driver**</span>* Treiber.  
  
3\. Installieren von Python  
Link: [https://www.python.org/ftp/python/3.14.4/python-3.14.4-amd64.exe](https://www.python.org/ftp/python/3.14.4/python-3.14.4-amd64.exe)

<span style="text-decoration: underline;">**Durchführung**</span>  
Um nun mit dem manuellen Flashen von Tasmota zu beginnen, muss zunächst das Python Paket "esptool" heruntergalden und installiert werden. Hierfür gib folgenden Befehl im Windows Terminal ein:  
<span style="background-color: rgb(53, 152, 219); color: rgb(255, 255, 255);">py -m pip install esptool</span>

<span style="background-color: rgb(255, 255, 255); color: rgb(0, 0, 0);">Nun müssen wir in das Verzeichnis wechseln, in der die Tasmota Firmware liegt (endend mit factory.bin)  
<span style="color: rgb(255, 255, 255); background-color: rgb(53, 152, 219);">cd %USERPROFILE%\\Downloads</span>  
</span>

Bevor wir die ESP-32 flashen, sollten wir die aktuellen Daten der ESP-32 löschen, um Datenrendundanz zu vermeiden:  
<span style="background-color: rgb(53, 152, 219); color: rgb(255, 255, 255);">py -m esptool --chip esp32 --port COM3 erase\_flash</span>  
  
**COM3** = USB Port --&gt; Kommt drauf an, an welchem Port die ESP-32 angeschlossen ist  
=&gt; Das kann man unter dem "**Geräte Manager**" in Windows herausfinden

Nun flashen wir die ESP-32 mit Tasmota:  
<span style="background-color: rgb(53, 152, 219); color: rgb(255, 255, 255);">py -m esptool --chip esp32 --port COM3 write\_flash 0x0 tasmota32.factory.bin  
</span>

<span style="text-decoration: underline; color: rgb(0, 0, 0);">**Tasmota Webkonsole aufrufen:** </span><span style="color: rgb(0, 0, 0);">Die Tasmota Webkonsole, kann über folgendem Link erreicht werden:  
Link: [https://tasmota.github.io/install/](https://tasmota.github.io/install/)  
Sollte die ESP-32 noch nicht mit dem WLAN verbunden sein, so klicke auf "**Change Wi-Fi**" und anschließend auf "**Visit Device**".</span>

Sollte die ESP-32 sich noch in einem anderen Netz befinden, so kann man auch über die Webkonsole die ESP-32 mit einem anderen WLAN-Netz verbinden.  
Dazu geht man unter "**Logging &amp; Console**", nachdem man den Tasmota Webinstaller offen hat und gibt in die Konsole folgendes ein:  
  
**Backlog SSID1 &lt;WLAN SSID&gt;; Password1 &lt;PASSWORT&gt;**

# RFID Konfiguration

<span style="text-decoration: underline;">**Verkabelung:**</span>

Pinanbindung des RFID Sensors zur ESP-32:  
(Wir schauen auf die ESP-32 von oben mit dem USB-C Port nach unten gerichtet)

**SDA** --&gt; IO05 (linkes Pinbrett 7. Pin innen)  
**SCK** --&gt; IO018 (linkes Pinbrett 4. Pin innen)  
**MOSI** --&gt; IO023 (linkes Pinbrett 6. Pin innen)  
**MISO** --&gt; IO019 (linkes Pinbrett 5. Pin innen)  
**GND** --&gt; GND (rechtes Pinbrett 1. Pin außen)  
**RST** --&gt; IO022 (rechtes Pinbrett 3. Pin innen)  
**3.3V** --&gt; 3.3V (linkes Pinbrett 8. Pin innen)

<span style="text-decoration: underline;">**Tasmota GPIO-Konfiguration:**</span>

Anmeldung zur Webkonsole der RFID-ESP32:  
**Nutzername**: *admin*  
**Passwort**: *wmzbj3JNAi1D0vwU1QGX*  
  
Nun konfigurieren wir die einzelnen Pins auf der ESP 32  
=&gt; Configuration &gt; Module  
  
GPIO018 --&gt; **SPI CLK**  
GPIO019 --&gt; **SPI MISO**  
GPIO023 --&gt; **SPI MOSI**  
GPIO05 --&gt; **RC522 CS**  
GPIO022 --&gt; **RC522 Rst**

<span style="text-decoration: underline;">**Broker-Topic:**</span>

Die ganzen RFID Scans werden unter dem Topic **esp32-rfid** veröffentlicht!  
=&gt; Der Output kommt dann unter dem Topic **tele/esp32-rfid/SENSOR** an!

# Credentials

 **<span style="text-decoration: underline;">Tasmota Webkonsole: ESP32 für LED:</span>**  
Nutzername: admin  
Webpasswort: h1NVITgqxwccLfY0Wx2I

<span style="text-decoration: underline;">**Tasmota Webkonsole: ESP32 für RFID:**</span>  
Nutzername: admin  
Webpasswort: wmzbj3JNAi1D0vwU1QGX

<span style="text-decoration: underline;">**Node-Red:**</span>  
Domäne: nodered.burgerbrater.de   
Nutzername: admin  
Passwort: w1W54GRFY1M014c  
  
<span style="text-decoration: underline;">**HiveMQ Creds:**</span>  
Name: burgerbrater@proton.me  
Passwort: )@3mvNF)8YU-US/7&amp;=,'

<span style="text-decoration: underline;">**HiveMQ backend User:** </span>Nutzername: backend\_nodered  
Passwort: vzd)4S=5FZJ(U!5

<span style="text-decoration: underline;">**PostgresSQL:**</span>  
Datenbank: access\_control  
Tabelle: rfid\_users  
User: nodered  
Passwort: Dg3fVpjvfhzb0ie   
  
Host intern: postgres  
Port intern: 5432

<span style="text-decoration: underline;">**HiveMQ Publish ONLY**</span>  
Username: broker\_pub  
Passwort: cx7R0fUu87Ljf61N0NLR

<span style="text-decoration: underline;">**HiveMQ Subscribe ONLY**</span>  
Username: broker\_sub  
Passwort: LrCqrtu9qpe8uJIyKeOB

# Doku und Präsi

##### <span style="text-decoration: underline;">**Zur Doku:**</span>

<span style="background-color: rgb(45, 194, 107);">FERTIG !!!</span>

##### <span style="text-decoration: underline;">**Zur Präsi:**</span>

<span style="text-decoration: underline;">**Mein Vorschlag zum Präsentieren:**</span>


<table border="1" id="bkmrk-themenblock-referent" style="border-collapse: collapse; width: 100%; height: 348.4px;"><colgroup><col style="width: 29.0778%;"></col><col style="width: 11.8042%;"></col><col style="width: 46.3647%;"></col><col style="width: 12.7533%;"></col></colgroup><tbody><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">**Themenblock**</td><td class="align-center" style="height: 29.8px;">**Referenten**</td><td class="align-center" style="height: 29.8px;">**Inhalt**</td><td class="align-center" style="height: 29.8px;">**Zeit**</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">Vorstellung</td><td class="align-center" style="height: 29.8px;">Daniel</td><td class="align-center" style="height: 29.8px;">Begrüßung, Teamvorstellung, Start der Präsentation</td><td class="align-center" style="height: 29.8px;">ca. 1 min.</td></tr><tr style="height: 46.6px;"><td class="align-center" style="height: 46.6px;">Übersicht Gesamtprojekt</td><td class="align-center" style="height: 46.6px;">offen?

alle/einer?

</td><td class="align-center" style="height: 46.6px;">Was ist unser Projekt (ganz kurz: Beschreibung / Ziel)?

Grafik Gesamtarchitektur zeigen und erklären

</td><td class="align-center" style="height: 46.6px;">ca. 1-2 min.

ca. 2 min.

</td></tr><tr style="height: 46.6px;"><td class="align-center" style="height: 46.6px;">LIVE DEMO</td><td class="align-center" style="height: 46.6px;">alle

ihr/einer?

</td><td class="align-center" style="height: 46.6px;">Unterbrechung der Präsi für Live-Demo...

Beschreibung welche Komponenten und grob Ablauf

</td><td class="align-center" style="height: 46.6px;">ca. 3-5 min.</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">Grundlagen / Einführung</td><td class="align-center" style="height: 29.8px;">Daniel</td><td class="align-center" style="height: 29.8px;">ggf. nochmal allgemeine Worte?

Kurze Theorie zu RFID

</td><td class="align-center" style="height: 29.8px;">ca. 2-4 min. ?</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">ESPs, MQTT</td><td class="align-center" style="height: 29.8px;">Lars</td><td class="align-center" style="height: 29.8px;">individueller Part</td><td class="align-center" style="height: 29.8px;">max. 5 min. ?</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">Backend, Dienste</td><td class="align-center" style="height: 29.8px;">Daniel</td><td class="align-center" style="height: 29.8px;">individueller Part</td><td class="align-center" style="height: 29.8px;">max. 5 min. ?</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">Node-RED, Flows</td><td class="align-center" style="height: 29.8px;">Phil</td><td class="align-center" style="height: 29.8px;">individueller Part</td><td class="align-center" style="height: 29.8px;">max. 5 min. ?</td></tr><tr style="height: 29.8px;"><td class="align-center" style="height: 29.8px;">YOLO-Cam</td><td class="align-center" style="height: 29.8px;">Nico</td><td class="align-center" style="height: 29.8px;">individueller Part</td><td class="align-center" style="height: 29.8px;">max. 5 min. ?</td></tr><tr style="height: 46.6px;"><td class="align-center" style="height: 46.6px;">Fazit</td><td class="align-center" style="height: 46.6px;">Daniel</td><td class="align-center" style="height: 46.6px;">Ergebnis, Verlauf (Probleme, Lösungen?), Ausblick

Beendigung der Präsi :)

</td><td class="align-center" style="height: 46.6px;">ca. 2 min.</td></tr></tbody></table>

<span style="text-decoration: underline;">**<span style="background-color: rgb(241, 196, 15);">Idee / Option:</span>**</span> **Jeder beginnt** seine individuellen Folien kurz **mit dem Schaubild** und ordnet ein, wo man sich gerade befindet und worum es technisch geht ?!?

**<span style="text-decoration: underline;"><span style="background-color: rgb(241, 196, 15);">Offen:</span></span>** **Übergänge moderierend** gestalten (nicht: "Jetzt kommt Lars." :D, sondern Überleitungssatz zu Thema, ohne Namen zu nennen) **ODER direkt** mit Blickkontakt absprechend und nahtlos übernehmen ?!? :D ...

<span style="text-decoration: underline; background-color: rgb(241, 196, 15);">**Offen bei Live-Demo:**</span> Klare Rollenverteilung vorab. Wer hält Chip? Wer redet/erklärt? Wer läuft durch Cam?

<span style="text-decoration: underline;">**Mein Vorschlag zur Bearbeitung:**</span>

An Tabelle orientieren für Ablauf. **Jeder bearbeitet seinen individuellen Part** auf Basis der Vorlagen-Präsi-Datei vor und lädt sie hier hoch.

**<span style="text-decoration: underline;"><span style="background-color: rgb(224, 62, 45);">Ausstehend:</span></span>** Wer trägt unterschiedliche Dateien **in finale Datei zusammen?** Wer hat sie als .**odt und .pdf?** Wer hat **Lapi** / präsentiert, etc.?

# Bilder