Installation der notwendigen Python-Tools

  1. Python 3.8 oder neuer installieren (z.B. über sudo apt install python3 python3-venv python3-pip).
  2. Virtuelle Umgebung anlegen (empfohlen):
    python3 -m venv moba_cam
  3. Virtuelle Umgebung aktivieren:
    source moba_cam/bin/activate
  4. Alle benötigten Python-Pakete installieren:
    pip install opencv-python numpy pillow
  5. Für Raspberry Pi GPIO-Unterstützung zusätzlich:
    pip install RPi.GPIO
    (nur auf Raspberry Pi notwendig)

Stellen Sie sicher, dass Sie die virtuelle Umgebung vor dem Start der Anwendung immer aktivieren!

Hilfe: Moba Cam v0.1

Willkommen zur Hilfe für Moba Cam v1.0 mit Rocrail-Anbindung für Modelleisenbahnen.

🚂 Leichtgewichtig und schnell! Moba Cam v1.0 nutzt klassische Bildverarbeitung mit OpenCV - keine KI/YOLO/CUDA-Abhängigkeiten. Ideal für Modellbahn-Anwendungen, wo der Fahrzeugtyp keine Rolle spielt.

🍓 GPIO-Unterstützung für Raspberry Pi! Bis zu 8 Relais können direkt per GPIO gesteuert werden.

🔀 Weichensteuerung! Zwei grafische Weichen (W1/W2) mit klickbaren Symbolen, editierbaren Namen und Skript-Unterstützung.

🚉 Schattenbahnhof-Automatik! Automatische Steuerung eines Schattenbahnhofs mit 3 Gleisen basierend auf Motion-Detection-Zonen.

📷 Automatische Belegungserkennung: Erkennt beim Programmstart automatisch welche Gleise belegt sind durch Bildvergleich mit Referenzbild.

Übersicht der Benutzeroberfläche

Linker Bereich (Video & Motion-Steuerung)

Mittlerer Bereich (Rocrail & Log)

Rechter Bereich (Aktionsauswahl)

Bewegungsrichtungspfeile

🏹 NEU: Bewegungsrichtungserkennung!

Die Anwendung kann die Bewegungsrichtung erkannter Objekte anzeigen:

Dies ist nützlich um zu erkennen, in welche Richtung sich Züge auf der Modellbahn bewegen.

Bewegungserkennungs-Parameter

Die folgenden Parameter können live angepasst werden und werden in der config.txt gespeichert:

Parameter Standard Beschreibung Tipps
Schwelle 25 Helligkeitsunterschied ab dem eine Bewegung erkannt wird (0-255). 10-15 für dunkle/kontrastarme Objekte. 30-50 für hellere Umgebungen.
Min.Größe 500 Mindestfläche in px² für erkannte Bewegungen. 100-200 für kleine Objekte (N-Spur). 500-1000 für größere Objekte (H0).
Blur 21 Gaussian Blur Kernel-Größe (muss ungerade sein). 5-11 für mehr Details. 21-31 für weniger Rauschen.
Dilate 2 Anzahl der Dilate-Iterationen zur Konturerweiterung. 3-5 verbindet nahe Bewegungen. 0-1 für präzisere Erkennung.

Tipp für dunkle Objekte: Schwelle=10-15, Blur=9-11, Dilate=3-4

ROI-Auswahl (Region of Interest)

Die ROI-Funktion ermöglicht es, nur einen bestimmten Bildbereich für die Bewegungserkennung zu verwenden.

ROI-Bereich festlegen:

  1. Klicken Sie auf "Bereich wählen".
  2. Ziehen Sie mit gedrückter linker Maustaste ein Rechteck über den gewünschten Bereich.
  3. Ein grünes Rechteck zeigt die aktuelle Auswahl.
  4. Klicken Sie auf "Zurück zum Hauptprogramm".

Trigger-Zonen bearbeiten

Mit dem Zonen-Editor können Sie Trigger-Zonen interaktiv anpassen.

Zonen-Bearbeitungsmodus:

  1. Klicken Sie auf "Zonen bearbeiten".
  2. Klicken Sie auf eine Zone um sie auszuwählen (wird grün).
  3. Ziehen Sie die Zone zum Verschieben.
  4. Ziehen Sie an den Ecken (grüne Kreise) zum Größe ändern.
  5. Klicken Sie auf "Zonen speichern" um die Änderungen zu speichern.

Konfigurationsdateien

config.txt - Programmeinstellungen

[Camera]
video_source = 0
width = 800
height = 600

[ROI]
enabled = false
x = 0
y = 0
width = 800
height = 600

[Connection]
host = localhost
port = 8051

[Motion]
motion_threshold = 25
motion_min_area = 500
motion_blur_size = 21
motion_dilate_iter = 2
debug_mode = false
debug_log_file = false

[TriggerZonen]
; Format: zonen_name = x_mitte, y_mitte, halbe_breite, halbe_hoehe
zone_1_links = 200,300,50,50
zone_2_mitte = 400,300,50,50
zone_3_rechts = 600,300,50,50
; ... weitere Zonen ...

[Scripting]
ausloesemodus = ki_trigger

; Trigger 1-9
trigger_1_active = true
trigger_1_target_script = mein_skript_script
trigger_1_target_zone = zone_1_links
; ... für Trigger 2-9 analog ...

; Kombinierter Trigger 10
trigger_10_active = false
trigger_10_target_zone1 = zone_10_A
trigger_10_target_zone2 = zone_10_B
trigger_10_target_script = kombi_skript_script

[CommandHistory]
count = 2
cmd0 = lc id="Lok1" cmd="velocity" v="30"
cmd1 = switch id="sw1" cmd="straight"

[GPIO]
gpio_1_pin = 17
gpio_2_pin = 27
gpio_3_pin = 22
gpio_4_pin = 23
gpio_5_pin = 24
gpio_6_pin = 25
gpio_7_pin = 5
gpio_8_pin = 6

[Weichen]
; Weiche W1
w1_name = W1
w1_rund_pin = 17
w1_rund_time = 500
w1_gerade_pin = 27
w1_gerade_time = 500
; Weiche W2
w2_name = W2
w2_rund_pin = 22
w2_rund_time = 500
w2_gerade_pin = 23
w2_gerade_time = 500

[Gleise]
; Gleisanzeige
gleis1_name = Gleis1
gleis1_pin = 24
gleis2_name = Gleis2
gleis2_pin = 25
gleis3_name = Gleis3
gleis3_pin = 12
        

script.txt - Rocrail-Aktionsskripte

[einfahrt_script]
; Weichenstraße für Einfahrt Gleis 1
cmd1 = <switch id="sw1" cmd="straight"/>
cmd2 = <switch id="sw2" cmd="turn"/>
cmd3 = <pause=0.5>
cmd4 = <signal id="einfahrt_signal" state="green"/>

[lok_start_script]
; Lok langsam anfahren
cmd1 = <lc id="BR218" cmd="velocity" v="30"/>
cmd2 = <pause=3>
cmd3 = <lc id="BR218" cmd="velocity" v="50"/>

[rangierfahrt_script]
; Rangierfahrt mit Rückmelder-Warten
cmd1 = Log: Starte Rangierfahrt
cmd2 = <lc id="Lok1" cmd="velocity" v="20"/>
cmd3 = <waitfb:fb_gleis2:timeout=30>
cmd4 = <lc id="Lok1" cmd="velocity" v="0"/>
cmd5 = Log: Ziel erreicht

# Deaktivierter Befehl (wird nicht ausgeführt):
# cmd6 = <lc id="Lok1" cmd="velocity" v="100"/>
        

Verfügbare Befehle:

Schattenbahnhof-Automatik (V5.0) mit Belegungserkennung (V6.0)

Die Schattenbahnhof-Automatik ermöglicht eine vollautomatische Steuerung eines Schattenbahnhofs mit 3 Gleisen basierend auf Motion-Detection-Zonen.

NEU in V6.0: Automatische Belegungserkennung beim Start

📷 Bildvergleich mit Referenzbild! Das System erkennt automatisch beim Programmstart, welche Gleise belegt sind.

Funktionsweise der Belegungserkennung:

  1. Referenzbild erstellen: Wenn der Schattenbahnhof LEER ist, klicken Sie auf "📷 Ref.Bild erstellen". Das Bild wird als sbf_ref.png gespeichert.
  2. Automatische Erkennung: Beim Programmstart wird das aktuelle Kamerabild mit dem Referenzbild verglichen.
  3. Differenzerkennung: Für jede Gleis-Zone wird berechnet, wie stark sich das Bild vom Referenzbild unterscheidet.
  4. Schwellwert: Der konfigurierbare Schwellwert (Standard: 2.0%) bestimmt, ab wann ein Gleis als belegt gilt.

Erkennungsmethoden (Multi-Kriterien):

Die Erkennung verwendet 4 Methoden - mindestens 2 müssen erfüllt sein:

MethodeSchwellwertBeschreibung
Mittlerer Unterschied> 8Durchschnittlicher Helligkeitsunterschied
Maximaler Unterschied> 60Maximaler Helligkeitsunterschied in der Zone
Standardabweichung> 12Streuung der Unterschiede (lokale Varianz)
Prozent über Schwelle> Konfig.Prozent der Pixel mit Unterschied > 5

Weichenstellung nach Erkennung:

GUI-Elemente für Belegungserkennung:

Gleisanzeige mit Signal-LEDs (V6.0):

Funktionsweise der Motion-Erkennung

Weichenlogik

Ziel-GleisWeiche W1Weiche W2
Gleis 1gerade-
Gleis 2rundrund
Gleis 3rundgerade

Konfiguration

Konfiguration in config.txt

[Schattenbahnhof]
auto_enabled = true
ausfahrt_zone = zone_ausfahrt
gleis1_zone = zone_1_gleis_1
gleis2_zone = zone_1_gleis_2
gleis3_zone = zone_1_gleis_3
belegung_schwellwert = 2.0
        

GUI-Elemente

Skriptbeispiel

[sbf_einfahrt]
; Schattenbahnhof-Automatik starten
cmd1 = Log: Schattenbahnhof-Betrieb aktiviert
cmd2 = <sbf:enable>
cmd3 = <sbf:status>

[sbf_reset]
; Alle Gleise freigeben
cmd1 = Log: Schattenbahnhof wird zurückgesetzt
cmd2 = <sbf:reset>
cmd3 = <gleis:1:on>
cmd4 = <gleis:2:on>
cmd5 = <gleis:3:on>

[sbf_belegung_pruefen]
; Belegung per Bildvergleich prüfen
cmd1 = Log: Prüfe Gleisbelegung...
cmd2 = <sbf:check>
cmd3 = <sbf:status>
        

Wichtig für Belegungserkennung:

GPIO-Steuerung (Raspberry Pi)

🍓 NEU in V2.0! Direkte Relais-Steuerung über GPIO-Pins auf dem Raspberry Pi.

Voraussetzungen:

Standard-GPIO-Pins (BCM-Nummerierung):

RelaisGPIO-PinPhysischer Pin
R117Pin 11
R227Pin 13
R322Pin 15
R423Pin 16
R524Pin 18
R625Pin 22
R75Pin 29
R86Pin 31

GPIO in Skripten verwenden:

[weichenheizung_script]
; Weichenheizung für 5 Sekunden einschalten
cmd1 = <gpio:17:on>
cmd2 = <pause=5>
cmd3 = <gpio:17:off>

[beleuchtung_script]
; Mehrere Relais schalten
cmd1 = <gpio:17:on>
cmd2 = <gpio:27:on>
cmd3 = <gpio:22:on>
cmd4 = <pause=10>
cmd5 = <gpio:17:off>
cmd6 = <gpio:27:off>
cmd7 = <gpio:22:off>
        

Hinweis: Auf nicht-Raspberry-Pi-Systemen (Windows, Linux PC) wird eine Warnung angezeigt, und GPIO-Befehle werden ignoriert. Das Programm funktioniert aber weiterhin für alle anderen Funktionen.

Weichensteuerung (W1/W2)

🔀 NEU in V4.0! Grafische Weichensteuerung mit klickbaren Symbolen.

Funktionsweise:

Standard-Pins:

WeicheRund PinGerade PinImpulszeit
W11727500ms
W22223500ms

Weichen in Skripten verwenden:

[weichenstrasse_script]
; Weichenstraße für Einfahrt mit GUI-Weichen
cmd1 = <weiche:W1:gerade>
cmd2 = <weiche:W2:rund>
cmd3 = <pause=0.5>
cmd4 = Log: Weichenstraße gestellt

[weiche_direkt_script]
; Weiche mit direkten Parametern (PIN:ZEIT_MS)
cmd1 = <weiche:W1:17:500>
cmd2 = <pause=1>
cmd3 = <weiche:W1:27:500>

[gleise_script]
; Gleise ein- und ausschalten
cmd1 = <gleis:Gleis1:on>
cmd2 = <gleis:2:on>
cmd3 = <pause=5>
cmd4 = <gleis:1:off>
cmd5 = <gleis:Gleis2:off>
        

Hinweis: Wenn der Skript-Befehl den gleichen Namen wie eine GUI-Weiche verwendet, wird das Symbol automatisch aktualisiert. Auch bei direkter Pin-Angabe wird das Symbol aktualisiert, wenn der Pin einer konfigurierten Weiche entspricht.

Gleisanzeige

🚃 NEU in V4.0! Drei Gleisanzeige-Buttons mit farbiger Statusanzeige.

Funktionsweise:

Standard-Pins:

GleisGPIO-Pin
Gleis124
Gleis225
Gleis312

Gleise in Skripten verwenden:

[beleuchtung_script]
; Gleisspannung einschalten
cmd1 = <gleis:Gleis1:on>
cmd2 = <gleis:2:on>
cmd3 = Log: Gleise 1 und 2 aktiv

[abschalten_script]
; Alle Gleise ausschalten
cmd1 = <gleis:1:off>
cmd2 = <gleis:2:off>
cmd3 = <gleis:3:off>
        

LED-Anzeigen für Trigger-Status

Jeder Motion-Trigger (1-10) hat eine LED-Anzeige:

Fehlerbehebung

Performance-Tipps


Version: v0.1 - Moba Cam mit automatischer Belegungserkennung

Reine Motion-Detection basierte Bewegungserkennung für Modellbahnen:

Hilfe - Moba Cam Motion Detection

Hilfe: Moba Cam - Motion Detection V6.0

Willkommen zur Hilfe für die Motion-Detection basierte Bewegungserkennung mit Rocrail-Anbindung für Modelleisenbahnen.

🚂 Leichtgewichtig und schnell! Diese Anwendung nutzt klassische Bildverarbeitung mit OpenCV - keine KI/YOLO/CUDA-Abhängigkeiten. Ideal für Modellbahn-Anwendungen, wo der Fahrzeugtyp keine Rolle spielt.

🍓 GPIO-Unterstützung für Raspberry Pi! Bis zu 8 Relais können direkt per GPIO gesteuert werden.

🔀 Weichensteuerung! Zwei grafische Weichen (W1/W2) mit klickbaren Symbolen, editierbaren Namen und Skript-Unterstützung.

🚉 Schattenbahnhof-Automatik! Automatische Steuerung eines Schattenbahnhofs mit 3 Gleisen basierend auf Motion-Detection-Zonen.

📷 NEU in V6.0: Automatische Belegungserkennung! Erkennt beim Programmstart automatisch welche Gleise belegt sind durch Bildvergleich mit Referenzbild.

Installation

Systemvoraussetzungen

Schritt 1: Python installieren

Windows:

  1. Laden Sie Python von python.org herunter
  2. Installieren Sie Python und aktivieren Sie "Add Python to PATH"

Linux/Raspberry Pi:

sudo apt update
sudo apt install python3 python3-pip python3-venv

macOS:

brew install python3

Schritt 2: Benötigte Python-Bibliotheken installieren

Die Software benötigt folgende Python-Bibliotheken:

Bibliothek Zweck Erforderlich
opencv-python Bildverarbeitung und Bewegungserkennung ✅ Ja
numpy Numerische Berechnungen (wird mit OpenCV installiert) ✅ Ja
Pillow Bildkonvertierung für Tkinter-Anzeige ✅ Ja
tkinter Grafische Benutzeroberfläche (meist vorinstalliert) ✅ Ja
RPi.GPIO GPIO-Steuerung für Raspberry Pi ❌ Optional (nur Raspberry Pi)

Installation mit pip:

pip install opencv-python pillow numpy

Für Raspberry Pi zusätzlich:

pip install RPi.GPIO

Hinweis: tkinter ist normalerweise bereits in Python enthalten. Falls nicht:

Linux/Raspberry Pi: sudo apt install python3-tk

macOS: Sollte mit Python mitgeliefert werden

Schritt 3: Software starten

Navigieren Sie zum Programmverzeichnis und starten Sie die Anwendung:

cd /pfad/zum/Moba_Cam
python Moba_cam_v06_alt1.py

Oder verwenden Sie eine der anderen Versionen:

python Moba_cam_v05.py
python Moba_cam_v04.py

Schritt 4: Erste Konfiguration

  1. Beim ersten Start wird automatisch eine config.txt erstellt
  2. Wählen Sie Ihre Kamera-Auflösung im Dropdown-Menü
  3. Passen Sie die Motion-Detection-Parameter an (Schwelle, Min.Größe, etc.)
  4. Klicken Sie auf "Konfig. speichern" um die Einstellungen zu sichern

Fehlerbehebung

Problem: "ModuleNotFoundError: No module named 'cv2'"

Lösung: pip install opencv-python

Problem: "ModuleNotFoundError: No module named 'PIL'"

Lösung: pip install pillow

Problem: Kamera wird nicht erkannt

Problem: GPIO funktioniert nicht auf Raspberry Pi

Übersicht der Benutzeroberfläche

Hilfe: Moba Cam - Motion Detection V6.0

Willkommen zur Hilfe für die Motion-Detection basierte Bewegungserkennung mit Rocrail-Anbindung für Modelleisenbahnen.

🚂 Leichtgewichtig und schnell! Diese Anwendung nutzt klassische Bildverarbeitung mit OpenCV - keine KI/YOLO/CUDA-Abhängigkeiten. Ideal für Modellbahn-Anwendungen, wo der Fahrzeugtyp keine Rolle spielt.

🍓 GPIO-Unterstützung für Raspberry Pi! Bis zu 8 Relais können direkt per GPIO gesteuert werden.

🔀 Weichensteuerung! Zwei grafische Weichen (W1/W2) mit klickbaren Symbolen, editierbaren Namen und Skript-Unterstützung.

🚉 Schattenbahnhof-Automatik! Automatische Steuerung eines Schattenbahnhofs mit 3 Gleisen basierend auf Motion-Detection-Zonen.

📷 NEU in V6.0: Automatische Belegungserkennung! Erkennt beim Programmstart automatisch welche Gleise belegt sind durch Bildvergleich mit Referenzbild.

Installation

Systemvoraussetzungen

Schritt 1: Python installieren

Windows:

  1. Laden Sie Python von python.org herunter
  2. Installieren Sie Python und aktivieren Sie "Add Python to PATH"

Linux/Raspberry Pi:

sudo apt update
sudo apt install python3 python3-pip python3-venv

macOS:

brew install python3

Schritt 2: Benötigte Python-Bibliotheken installieren

Die Software benötigt folgende Python-Bibliotheken:

Bibliothek Zweck Erforderlich
opencv-python Bildverarbeitung und Bewegungserkennung ✅ Ja
numpy Numerische Berechnungen (wird mit OpenCV installiert) ✅ Ja
Pillow Bildkonvertierung für Tkinter-Anzeige ✅ Ja
tkinter Grafische Benutzeroberfläche (meist vorinstalliert) ✅ Ja
RPi.GPIO GPIO-Steuerung für Raspberry Pi ❌ Optional (nur Raspberry Pi)

Installation mit pip:

pip install opencv-python pillow numpy

Für Raspberry Pi zusätzlich:

pip install RPi.GPIO

Hinweis: tkinter ist normalerweise bereits in Python enthalten. Falls nicht:

Linux/Raspberry Pi: sudo apt install python3-tk

macOS: Sollte mit Python mitgeliefert werden

Schritt 3: Software starten

Navigieren Sie zum Programmverzeichnis und starten Sie die Anwendung:

cd /pfad/zum/Moba_Cam
python Moba_cam_v06_alt1.py

Oder verwenden Sie eine der anderen Versionen:

python Moba_cam_v05.py
python Moba_cam_v04.py

Schritt 4: Erste Konfiguration

  1. Beim ersten Start wird automatisch eine config.txt erstellt
  2. Wählen Sie Ihre Kamera-Auflösung im Dropdown-Menü
  3. Passen Sie die Motion-Detection-Parameter an (Schwelle, Min.Größe, etc.)
  4. Klicken Sie auf "Konfig. speichern" um die Einstellungen zu sichern

Fehlerbehebung

Problem: "ModuleNotFoundError: No module named 'cv2'"

Lösung: pip install opencv-python

Problem: "ModuleNotFoundError: No module named 'PIL'"

Lösung: pip install pillow

Problem: Kamera wird nicht erkannt

Problem: GPIO funktioniert nicht auf Raspberry Pi

Übersicht der Benutzeroberfläche

🚂 Leichtgewichtig und schnell! Diese Anwendung nutzt klassische Bildverarbeitung mit OpenCV - keine KI/YOLO/CUDA-Abhängigkeiten. Ideal für Modellbahn-Anwendungen, wo der Fahrzeugtyp keine Rolle spielt.

🍓 GPIO-Unterstützung für Raspberry Pi! Bis zu 8 Relais können direkt per GPIO gesteuert werden.

🔀 Weichensteuerung! Zwei grafische Weichen (W1/W2) mit klickbaren Symbolen, editierbaren Namen und Skript-Unterstützung.

🚉 Schattenbahnhof-Automatik! Automatische Steuerung eines Schattenbahnhofs mit 3 Gleisen basierend auf Motion-Detection-Zonen.

📷 NEU in V6.0: Automatische Belegungserkennung! Erkennt beim Programmstart automatisch welche Gleise belegt sind durch Bildvergleich mit Referenzbild.

Installation

Systemvoraussetzungen

Schritt 1: Python installieren

Windows:

  1. Laden Sie Python von python.org herunter
  2. Installieren Sie Python und aktivieren Sie "Add Python to PATH"

Linux/Raspberry Pi:

sudo apt update
sudo apt install python3 python3-pip python3-venv

macOS:

brew install python3

Schritt 2: Benötigte Python-Bibliotheken installieren

Die Software benötigt folgende Python-Bibliotheken:

Bibliothek Zweck Erforderlich
opencv-python Bildverarbeitung und Bewegungserkennung ✅ Ja
numpy Numerische Berechnungen (wird mit OpenCV installiert) ✅ Ja
Pillow Bildkonvertierung für Tkinter-Anzeige ✅ Ja
tkinter Grafische Benutzeroberfläche (meist vorinstalliert) ✅ Ja
RPi.GPIO GPIO-Steuerung für Raspberry Pi ❌ Optional (nur Raspberry Pi)

Installation mit pip:

pip install opencv-python pillow numpy

Für Raspberry Pi zusätzlich:

pip install RPi.GPIO

Hinweis: tkinter ist normalerweise bereits in Python enthalten. Falls nicht:

Linux/Raspberry Pi: sudo apt install python3-tk

macOS: Sollte mit Python mitgeliefert werden

Schritt 3: Software starten

Navigieren Sie zum Programmverzeichnis und starten Sie die Anwendung:

cd /pfad/zum/Moba_Cam
python Moba_cam_v06_alt1.py

Oder verwenden Sie eine der anderen Versionen:

python Moba_cam_v05.py
python Moba_cam_v04.py

Schritt 4: Erste Konfiguration

  1. Beim ersten Start wird automatisch eine config.txt erstellt
  2. Wählen Sie Ihre Kamera-Auflösung im Dropdown-Menü
  3. Passen Sie die Motion-Detection-Parameter an (Schwelle, Min.Größe, etc.)
  4. Klicken Sie auf "Konfig. speichern" um die Einstellungen zu sichern

Fehlerbehebung bei der Installation

Problem: "ModuleNotFoundError: No module named 'cv2'"

Lösung: pip install opencv-python

Problem: "ModuleNotFoundError: No module named 'PIL'"

Lösung: pip install pillow

Problem: Kamera wird nicht erkannt

Problem: GPIO funktioniert nicht auf Raspberry Pi

Übersicht der Benutzeroberfläche

.config-section { background-color: #eaf2f8; border-left: 5px solid #3498db; padding: 15px; margin-bottom: 15px; } .script-example { background-color: #e8f6f3; border-left: 5px solid #1abc9c; padding: 15px; margin-bottom: 15px; } .note { background-color: #fef9e7; border-left: 5px solid #f1c40f; padding: 10px; margin-bottom: 10px; } .warning { background-color: #fdedec; border-left: 5px solid #e74c3c; padding: 10px; margin-bottom: 10px; } .new { background-color: #e8f8f5; border-left: 5px solid #1abc9c; padding: 10px; margin-bottom: 10px; } .install { background-color: #ebf5fb; border-left: 5px solid #5dade2; padding: 15px; margin-bottom: 15px; } table { width: 100%; border-collapse: collapse; margin-bottom: 20px; }