COVID-19 is a contagious disease caused by the coronavirus SARS-CoV-2. In January 2020, the disease spread worldwide, resulting in the COVID-19 pandemic.
The symptoms of COVID‑19 can vary but often include fever,[7] fatigue, cough, breathing difficulties, loss of smell, and loss of taste.[8][9][10] Symptoms may begin one to fourteen days after exposure to the virus. At least a third of people who are infected do not develop noticeable symptoms.[11][12] Of those who develop symptoms noticeable enough to be classified as patients, most (81%) develop mild to moderate symptoms (up to mild pneumonia), while 14% develop severe symptoms (dyspnea, hypoxia, or more than 50% lung involvement on imaging), and 5% develop critical symptoms (respiratory failure, shock, or multiorgan dysfunction).[13] Older people have a higher risk of developing severe symptoms. Some complications result in death. Some people continue to experience a range of effects (long COVID) for months or years after infection, and damage to organs has been observed.[14] Multi-year studies on the long-term effects are ongoing.[15]
COVID‑19 transmission occurs when infectious particles are breathed in or come into contact with the eyes, nose, or mouth. The risk is highest when people are in close proximity, but small airborne particles containing the virus can remain suspended in the air and travel over longer distances, particularly indoors. Transmission can also occur when people touch their eyes, nose, or mouth after touching surfaces or objects that have been contaminated by the virus. People remain contagious for up to 20 days and can spread the virus even if they do not develop symptoms.[16]
Testing methods for COVID-19 to detect the virus’s nucleic acid include real-time reverse transcription polymerase chain reaction (RT‑PCR),[17][18] transcription-mediated amplification,[17][18][19] and reverse transcription loop-mediated isothermal amplification (RT‑LAMP)[17][18] from a nasopharyngeal swab.[20]
Several COVID-19 vaccines have been approved and distributed in various countries, many of which have initiated mass vaccination campaigns. Other preventive measures include physical or social distancing, quarantining, ventilation of indoor spaces, use of face masks or coverings in public, covering coughs and sneezes, hand washing, and keeping unwashed hands away from the face. While drugs have been developed to inhibit the virus, the primary treatment is still symptomatic, managing the disease through supportive care, isolation, and experimental measures.
Ziel: Extrem Energieeffizienter Betrieb eines Raspberry Pi im Wohnwagen inkl. zyklischem Start, Alarmüberwachung. Übertragung Systemstatus und Alarme an Backend/Smartphone über Wi-Fi oder LTE.
🔋 Stromversorgung & Energieoptimierung
Versorgung: 12 V LiFePO₄-Akku mit 200Ah
Regler: 3.3 V MP1584 für den ATmega328P
Raspberry Pi 4: Strom wird über MOSFET Treiber nur bei Bedarf aktiviert. Buck converter 5V 10A
Verteiltes System von ATmega328P die über 4-Draht verbunden sind (Wakeup-Line von main and die nodes, Alarm-Line von Nodes an Main, 2 x A/B für RS485 Kommunikation)
Gesamtsystem im Sleep: <30 µA Stromverbrauch mit aktivem Watchdog
Komponente
Modell/Typ
Funktion
Mikrocontroller
ATtiny4313 (DIL)
Zentrale Steuerung
RTC-Modul
DS3231
Zeitgeber für Zyklusstart
Taster
Digital, mit Pull-Up
Start-/Shutdown-Steuerung
2 x Alarmkontakt
Reed-Schalter o.Ä.
Fenster-/Türüberwachung
LED
3.3 V
Statusblinker alle 10 s wenn Armed. Wenn Alarm flackern. Ansonsten aus.
UART
TX/RX auf 3.3 V
Kommunikation mit Raspberry Pi
Alarmausgang
GPIO an Treiber mit 12v schaltausgang
Anschluss von Verbraucher wie zum Beispiel Sirene
Schaltausgang
GPIO an Treiber der 12 V auf einen 5 V 5A DC-DC Converter bringt.
Stromzufuhr für Raspberry und weitere 5 V Verbraucher
Screenshot
Arduino PIN
Physischer Pin
Pin
Funktion
Richtung
Beschreibung
1
PA2
Reset
Eingang
Für ISP
0
2
PD0
UART RX
Eingang
Kommunikation RPi → ATtiny
1
3
PD1
UART TX
Ausgang
Kommunikation ATtiny → RPi
4
PA1
5
PA0
2
6
PD2
INT0 (RTC Alarm)
Eingang
Weckt ATtiny
3
7
PD3
Taster
Eingang
Kurz-/Lang-Druck
4
8
PD4
I²C SDA
I²C
RTC-Kommunikation
5
9
PD5
I²C SCL
I²C
RTC-Kommunikation
10
GND
Ground
6
11
PD6
Status-LED
Ausgang
Blinkt alle 30s
7
12
PB0
RPi Power Enable
Ausgang
Steuert MOSFET mit 12V der über Buck-Converter RPi versorgt
8
13
PB1
Alarmkontakt 1
Eingang
Fenster-/Türkontakt (Hüllschutz)
9
14
PB2
Alarmkontakt 2
Eingang
zusatzkontakte wie fliegengitter falls Fenster offen.
10
15
PB3
Alarmausgang
Ausgang
Ansteuerung Verbraucher über 12 V Treiber (z.B. Sirene)
11
16
PB4
12
17
PB5
MOSI
Eingang
ISP
13
18
PB6
MISO
Ausgang
ISP
14
19
PB7
SCL
Eingang
ISP
20
VCC
Versorgung
Eingang
am 3,3 V Buck-Converter
Arduino Main
ATmega328P hat 3 PCINT Gruppen jeweils für die Bänke B, D und D:
Vektor
Pin-Gruppe
Register
Pins
PCINT0_vect
PORTB
PCMSK0
PB0–PB7 (D8–D13 + SPI)
PCINT1_vect
PORTC
PCMSK1
PC0–PC5 (A0–A5)
PCINT2_vect
PORTD
PCMSK2
PD0–PD7 (D0–D7)
Wichtige Kriterien für die Wahl der Pin:
Möglichst viele Interrupteingänge in meiner Hand
Hardware-Interrupts sollen für Taster genutzt werden um Debouncing zu ermöglichen
Interrupt von der Peripherie (RTC, MPU, RFID, PIR) können auf einen gemeinsamen PCINT Vector wenn notwendig.
Die Software Serial benötigt einen Interrupt auf dem RX pin. Damit ist die Gruppe nicht mehr für andere Interrupts in Code außerhalb von Software Serial (oder auch andere Instanzen von Software Serial) nutzbar.
Da zwei Software Serial eingesetzt werden, sind das schon zwei PCINT vectoren die nicht genutzt werden können. Daher wählte ich die PINs so dass auf den Gruppen eh bereits viele Standardfunktionen wie HW-Serial, SPI, I2C, Xtal genutzt werden.
Daher Port / PCINT2_vect für Eingänge, wodurch ich auf zusätzliche 4 zusätzliche IRQ Eingänge (PD4-PD7) komme. Zum Vergleich: Da SPI genutzt wird hätte PCINT0_vect / PortB nur 2 IRQ Pins.
Use-Case
Status ✅ / ⚠️ / ❌
Kommentar
2× Taster
✅
D3 (INT1) & D5 (PCINT2)
1× Status-LED
✅
A0 / PC0
RTC via I²C
✅
PC4/PC5 (A4/A5)
RTC Wakeup (Interrupt)
✅
PD2 (INT0)
MPU via I²C
✅
PC4/PC5 (A4/A5)
MPU Interrupt
✅
PD4 (PCINT2)
Raspberry Power Switch
✅
PB6 (XTAL1)
Alarmgeber Schaltausgang
✅
PB7 (XTAL2)
RFID via SPI
✅
PB2–PB5
RFID IRQ
✅
PD7
RFID Stromschaltung
✅
PD6 über ULN
RS-485 Kommunikation
✅
SW Serial auf PB0 (RX) / PB1 (TX)
Victron VE.Direct UART
✅
SW Serial auf PC2/PC3
I²C Geräte (RTC, MPU, MCP)
✅
PC4/PC5
Piezo Signalgeber
✅
PC1 (A1)
HW
Pin
Arduino
Funktion
Verwendung
Interrupt
Interrupt-Vektor
1
RESET
RESET
ISP RST (evtl. auch an Raspberry zum Flashen über Bootloader HW-Serial)
2
PD0
D0
HW UART RX
Kommunikation mit Raspberry Pi über TTL 3,3V
Nein
–
3
PD1
D1
HW UART TX
Kommunikation mit Raspberry Pi über TTL 3,3V
Nein
–
4
PD2
D2
INT0 / Taster
System-Taster für Start und Shutdown
Ja
INT0
5
PD3
D3
INT1 / Taster
Externer Taster um System kurzzeitig in Bereitschaft für Interaktionen (z.B. Alarm deaktivieren) zu versetzen
Ja
INT1
6
PD4
D4
Digital In / Peripherie Interrupt
RTC Interrupt für tägliches Aufwach-Event
Ja
PCINT2
7
VCC
8
GND
9
PB6
XTAL1
Digital Out / Power Switch
Raspberry Power über MOSFET Treiber um den High-Power 5V Buckconverter zu schalten
Nein
–
10
PB7
XTAL2
Digital Out / Alarm Switch
Alarmgeber (z.B. Sirene) mit Strom versorgen. Kann entweder über ULN2003 (<500ms) oder über MOSFET betrieben werden
Nein
–
11
PD5
D5
Digital In / Peripherie Interrupt
MPU IRQ / Alarm bei Erschütterung/Neigung/Bewegung des Wohnwagens
Ja
PCINT2
12
PD6
D6
Digital Out / Power Switch
RFID Power (über ULN2003 für GND)
Nein
PCINT2
13
PD7
D7
Digital In / Peripherie Interrupt
RFID IRQ
Ja
PCINT2
14
PB0
D8
RS485 RX (SW Serial)
Software Serial an RS485 Treiber
Ja
PCINT0
15
PB1
D9
RS485 TX (SW Serial)
Software Serial an RS485 Treiber
Nein
PCINT0
16
PB2
D10
SPI SS
RFID SS
Nein
PCINT0
17
PB3
D11
SPI MOSI
RFID MOSI / RFID MOSI
Nein
PCINT0
18
PB4
D12
SPI MISO
RFID MISO / ISP MISO
Nein
PCINT0
19
PB5
D13
SPI SCK
RFID SCK / ISP SCK
Nein
PCINT0
20
AVCC
21
AREF
22
GND
23
PC0
A0
Digital Out
Status LED (An/Watchdog/Alarm-Status/Fehler/Shutdown)
Nein
PCINT1
24
PC1
A1
Piezo
Quittierungston für Alarm (de-)aktivierung (evtl. über Treiber ULN2003)
Nein
PCINT1
25
PC2
A2
SW UART RX
Verbindung zu Victron MPPT Solar Charger
Ja (in SoftwareSerial Lib)
PCINT1
26
PC3
A3
SW UART TX
Verbindung zu Victron MPPT Solar Charger
Nein
PCINT1
27
PC4
A4
I2C SDA
Verbindung zu RTC, MPU und Port Extender
Nein
PCINT1
28
PC5
A5
I2C SCL
Verbindung zu RTC, MPU und Port Extender
Nein
PCINT1
🧠 Betriebs- und Alarmzustände
🔁 operatingMode
Off: Kein Betrieb
Periodic: Pi startet durch RTC-Alarme (zyklisch)
On: Pi bleibt dauerhaft an
Alert: Alarm wurde ausgelöst
stateDiagram-v2
[*] --> off
off --> alert: Alarm-In
off --> periodic: RTC event
off --> on: Button
periodic --> on: Button
periodic --> on: (PI) set_state
periodic --> alert: Alarm-In
periodic --> off: (PI) ack_shutdown
on --> alert: Alarm-In
on --> off: (PI) ack_shutdown
alert --> on: (PI) quit_alert
State in
State out
Trigger
Comment
off
periodic
RTC event
Once a day the RTC will start the PI
off
on
Button
Start PI permanent due to user button press
periodic
on
Button
Start PI permanent due to user button press
on
off
Serial msg: „ack_shutdown“
Pi confirms that an ordinary shutdown took place. Power can be turned off
periodic
off
Serial msg: „ack_shutdown“
Pi confirms that an ordinary shutdown took place. Power can be turned off
off
alert
Alert-Contact
alarm loop has been triggered
periodic
alert
Alert-Contact
alarm loop has been triggered
on
alert
Alert-Contact
alarm loop has been triggered
alert
on
Serial msg: „quit_alert“
Alarm stopped. Pi keeps on.
Ausgangslogik:
Ausgang
Off
Periodic
On
Alert
Pi-Power
0
1
1
1
Signal
0
0
0
1
Status LED
Armed: Slow / Disarmed: Off
Fast
Event- / Status-Matrix
Event / Input
Off
Periodic
On
Alert
Button
On
On
noop
x
RTC
Periodic
noop
x
x
Serial set_state
noop
OK
OK
x
Alert-Contact
Alert
Alert
Alert
x
Serial ack_shutdown
noop
Off
Off
x
Serial quit_alert
noop
noop
noop
On
🚨 alarmMode
Disarmed: Alarmüberwachung aus
Armed: Überwachung aktiv
🔄 Zustandsübergänge
Auslöser
Aktion
Taster kurz (<1 s)
Pi einschalten
Taster lang (>3 s)
Pi herunterfahren (außer im Alert-Modus)
RTC-Alarm (DS3231)
Pi einschalten im Periodic-Modus außer wenn Alter oder Permanent
Alarmkontakt öffnet
alarmMode → Alert
Seriell vom RPi:
set_mode permanent
→ operatingMode permanent
set_alarm armed
→ alarmMode armed
shutdown
→ Poweroff 10s nach Bestätigung
set_next_cycle 04:00:00
→ RTC-Alarm neu setzen
💬 Serielles Protokoll (UART)
Baudrate: 9600 bps Pegel: 3.3 V TTL (direkt kompatibel mit Raspberry Pi)
Bewegungsmelder an einen Wi-Fi RGB(WW/CW) LED-Controller anbinden
Für mein Badezimmer finde ich doch mein normales Licht etwas hell, weshalb eine indirekte LED Beleuchtung her musste die auch in der Farbe variabel einstellbar ist. Alles kein Hexenwerk aber es sollte auch mit meiner bestehenden OpenHAB 3 über alle Inputs steuerbar sein und ein schönes Nachlicht hergeben damit man auch Nachts sicher unterwegs ist ohne zu stark aufzuwachen.
Somit waren die Anforderungen recht schnell klar:
Gute Anbindung an OpenHAB (3)
Viel Power um auch lange LED Strips verwenden zu können
Möglichst gutes Privacy Verhalten (schließt das China-Zeugs aus)
Es sollte nur bei Bedarf leuchten (z.B. mit Bewegungsmelder)
Nun gibt es bei Amazon einige Wi-Fi RGB LED Controller die alle vielversprechend aussahen. All diese Controller basieren auf mehr oder weniger dem gleichen Chipsatz ESP8266 auf welchem es eine breite Masse an alternativer Firmware gibt. Für mich ist der Tasmota die Wahl der Dinge, aber es gibt bestimmt auch andere gute Derivate. Mit ESPurna habe ich jedoch keine gute Erfahrung gemacht.
Mit dieser alternativen Firmware ist bereits der erste große Schritt gemeistert und die No-Privacy China-Firmware kann entfernt werden. Zudem bietet diese Firmware die Möglichkeit für eigene Erweiterungen („Rules“ / Scripting) und kann über MQTT angesteuert werden.
Für meine Verwendung habe ich einen größeren Controller ausgewählt, da dieser viel Power bietet, Schraubterminals besitzt und im Gehäuse genügend Platz zum basteln und. tüfteln ist.
Nun kommen wir aber zum interessanten Teil der Arbeit: Und zwar soll das Licht ja auch nicht die ganze Nacht leuchten und nur bei Bedarf angehen. Und zwar das nur für die Nacht.
Dazu kommen ein paar zusätzliche Anpassungen dazu:
Ein Bewegungsmelder muss an den LED Controller angebunden werden um Bewegungen in der Umgebung wahrzunehmen
Die Controllersoftware muss erweitert werden um die LEDs bei Bewegung einzuschalten und für eine bestimmte vorkonfigurierte Zeitspanne eingeschaltet. Dieser Teil sollte auch deaktivierbar (Tag/Nacht) sein.
In OpenHAB gibt es über das Astro Binding für den aktuelle Standort minutengenaue Angaben zum Sonnenunter- und -aufgang. OpenHAB soll so erweitert werden, so dass dieses die Steuerung im Controller zum richtigen Zeitpunkt aktiviert (Sonnenuntergang) und deaktiviert (Sonnenaufgang) wird.
PIR Sensor an den Wi-Fi RGB LED-Controller anbinden
TODO
Ich habe mich für die PIR-Sensoren AM312 (z.B. als 5er-Pack bei Amazon) entschieden das diese mit 3,3 V ausreichend versorgt werden und einfach einen Schließerkontakt bei Bewegung haben. Nachteil gegenüber einigen anderen ist, dass diese nicht einstellbar sind. Für diesen Use-Case sollte dies aber nicht von belang sein.
Belegung AM312
Auf der Unterseite des LED-Controllers befinden sich einige Pins die zum flashen aber auch zum herausführen der Stromversorgung genutzt werden können
Abzwacken der Stromversorgung für den PIR-Sensor + temporäre Stiftleiste zum Flashen
Die Stiftleiste die auf IO, RX und TX geht ist ausschließlich temporär zum erstmaligen Flashen der Tasmota Firmware gedacht und wird anschließend wieder entfernt.
Nun muss noch ein Plätzchen für den Sense-PIN des PIR Moduls gefunden werden. Hierfür habe ich den GPIO 4 ausgewählt da dieser anscheinend noch nicht belegt ist (siehe Grafik)
Belegung ESP Wi-Fi Chipsatz auf dem LED Controller
Dieser wird auf der Vorderseite direkt an das ESP Breakout-Board angelötet
Anlöten an den GPIO 4 des ESP Breakout-Boards auf der VorderseiteGPIO Konfiguration in Tasmota mit Mapping von GPIO4 (PIR) auf Switch_1
Falls nicht nur RGB sondern auch WW (Warm White) bzw. CW (Cold White) angebunden werden soll, müssen diese GPIOs auch noch konfiguriert werden. Es empfiehlt sich aber nur die benötigten Ausgänge zu konfigurieren, da Tasmota anhand der Konfiguration die Farben mischt.
Anpassung Software auf dem Controller
Die Anpassung auf dem LED Controller habe ich in zwei Rules aufgeteilt. Dies kommt daher dass sich Rules einfach ein- und ausschalten lassen und ich damit die ganze Funktion („schalte Licht bei Bewegung an“) ausschalten kann während noch notwendige Funktionalitäten in der anderen Rule aktiv sind. Eine Rule setze ich also zur Beobachtung des Status, wie z.B. Events/Veränderungen die über MQTT oder des ablaufenden Timers ein, also die Funktionen die immer aktiv sein sollen.
RULE2
ON event#PIR1-STATE==?
DO
VAR1 %value%
ENDON
ON event#PIR1-TIMEOUT>0
DO
VAR2 %value%
ENDON
ON VAR1#State==?
DO BACKLOG
RULE3 %value%;
Publish stat/%topic%/PIR1-STATE %value%
ENDON
ON VAR2#State>0
DO
Publish stat/%topic%/PIR1-TIMEOUT %value%
ENDON
ON Rules#Timer==3
DO
Power1 OFF
ENDON
Man sieht hier gut dass die Rule3 je nach Zustand von Var1 gesetzt wird. Var1 nutze ich somit zum (de)aktivieren der Bewegungsmelderfunktion. Diese Variable wird wiederum von dem MQTT Event „PIR1-STATE“ verändert. Zudem wird das Licht ausgeschalten wenn der Timer 3 abläuft.
Eine weitere Rule soll rein auf die Bewegungen lauschen und somit auf Veränderungen an dem GPIO 4, welcher durch die vorige Konfiguration auf „Switch1“ gemapped wurde. Die Veränderungen werden auch über MQTT announced und wenn der Switch1 auf ON geht (== Bewegung erkannt) wird zusätzlich Timer 3 auf die in Var2 festgelegte Zeit gesetzt. Dadurch kann man einen Nachlauf nach der zuletzt erkannten Bewegung sicherstellen.
RULE3
ON Switch1#State==ON
DO BACKLOG
Power1 %value%;
RuleTimer3 %VAR2%;
Publish stat/%topic%/PIR1-MOTION %value%
ENDON
ON Switch1#State==OFF
DO
Publish stat/%topic%/PIR1-MOTION %value%
ENDON
Im folgenden noch einige Standardwerte die einmalig definiert werden sollten. Der Rest kann dann über MQTT gesteuert werden.
BACKLOG
RULE2 ON;
RULE3 OFF;
VAR1 OFF;
VAR2 300;
Um zu verhindern dass Switch_1 den zugeordneten Output (Power) ansteuert und dass der Switch nur unserer Rule zur Verfügung steht muss die folgenden Option gesetzt werden:
SetOption114 1
Da standardmäßig die Konfiguration für einen Switch auf „Toggle“ gestellt ist, wir aber in unserer Rule ein ON/OFF erwarten muss das Switch-Verhalten umgestellt werden:
SwitchMode 1
(De-)Aktivierung des Bewegungsmelders bei Sonnenuntergang / Sonnenaufgang
TODO
val String loggerName = "SunsetSunriseRules"
rule "Sunrise handler"
when
Channel "astro:sun:local:rise#event" triggered START
then
//bad_led_motion_detection.postUpdate(OFF)
bad_led_motion_detection.sendCommand(OFF)
logError(loggerName, "Run sunrise handler")
end
rule "Sunset handler"
when
Channel "astro:sun:local:set#event" triggered START
then
//bad_led_motion_detection.postUpdate(ON)
bad_led_motion_detection.sendCommand(ON)
logError(loggerName, "Run sunset handler")
end
Damit die zuvor definiert Rule funktioniert, müssen natürlich die Things und Items entsprechend in OpenHAB definiert sein.
Immer wieder ärgere ich mich wenn ich neue Passbilder brauche. Zwar ist eine Foto selbst schnell gemacht, aber die Vorbereitung für das Drucken ist immer wieder eine nervige Angelegenheit. Wie groß muss das Foto gleich wieder sein? Wie bekomme ich es hin das am Fotodrucker genau diese Größe am Ende rauskommt? Macht der Fotodrucker mein Foto etwas größer und in welchem Maße?
Bislang bemühte ich dazu Gimp und einen Taschenrechner. Nachdem ich nun das Tool montage kenne, habe ich ein kleines wrapper script geschrieben um diese Schritte automatisiert zu machen.