Beim Smart Appliance Enabler handelt es sich um eine Spring Boot -Anwendung mit einer Angular -Web-Anwendung.
Für den Smart Appliance Enabler existiert eine Continuous Integration -Umgebung, in der die Anwendung vollständig automatisiert gebaut und getestet wird:
Sobald Änderungen am Smart Appliance Enabler-Github-Repository erkannt werden, wird dies an Travis-CI signalisiert. Daraufhin wird dort eine virtuelle Umgebung gestartet, in welcher der Smart Appliance Enabler gebaut wird. Dabei werden auch die Unit-Tests ausgeführt, wobei Daten über die Testabdeckung gewonnen werden. Diese Coverage-Daten werden zu codecov gepusht, wo sie visualisiert werden. Als Build-Artefakt entsteht die Datei SmartApplianceEnabler.war, die sich in einer Java-Runtime starten läßt. Um die Installation (Java, Konfigurationsdateien, ...) zu vereinfachen, wird ein Docker-Image speziell für CI erstellt, das den Smart Appliance Enabler mit allen benötigten Dateien inlusive Java-Runtime enthält. Wegen der Platformabhängigkeit der Java-Runtime ist das Docker-Image nur auf Prozessoren mit amd64-Architektur lauffähig (also nicht auf Raspberry Pi!). Das Docker-Image wird zu Docker-Hub gepusht.
In der AWS -Cloud läuft eine EC2 -Instanz mit Amazon Linux darauf. Als einzige Software wurde Docker installiert. Im Rahmen des Build-Vorgangs auf Travis-CI wird ein Shell-Script auf der EC2-Instanz ausgeführt, welches das Smart Appliance Enabler-Docker-Image für CI von Docker-Hub pullt und einen Container damit startet. Dadurch gibt es einen laufenden Smart Appliance Enabler, der vom Internet aus zugreifbar ist und für Tests zur Verfügung steht.
Um die Funktionalität insgesamt (d.h. Web-Anwendung und Spring Boot-Anwendung) zu testen, wird über Web-Browser eine neue Konfiguration erstellt. Diese Browser-basierten Tests werden mittels BrowserStack mit verschieden Web-Browsern auf unterschiedlichen Betriebssystemen ausgeführt, wobei die URL des Smart Appliance Enabler in EC2-Instanz verwendet wird.
Für den Betrieb des Smart Appliance Enabler als Docker-Container auf einem Raspberry Pi muss für jedes Release (nicht für jeden Push zu Github!) ein Docker-Image mit einer Java-Runtime für arm32-Architektur erstellt werden. Was liegt näher, als diese Aufgabe von einem meiner Raspberry Pi's automatisch erledigen zu lassen. Auch dieses Image wird zu Docker-Hub gepusht.
- EC2 Instance anlegen:
- Amazon Linux 2 AMI (HVM), SSD Volume Type
- Type: t2.micro
- ggf. Keypair erzeugen
- Security Group anlegen mit Inbound Access für SSH + HTTP (Source: Anywhere)
- Security Group zuweisen: Actions -> Networking -> Change Security Groups
In der gestarteten Instanz folgende Befehle ausführen:
sudo yum update -y
sudo yum install docker -y
sudo service docker start
sudo service docker status
Falls das EC2 Dashboard laufende Instanzen nicht anzeigt, stimmt möglicherweise die Region nicht mit der Region überein, in der die Instanzen angelegt wurden (z.B. us-east-2).
Für alle nachfolgenden Schritte müssen die Sourcen lokal vorhanden sein. Am einfachsten verwendet man einen Git-Client (Git installieren) zum Klonen des Repositories:
git clone https://github.com/camueller/SmartApplianceEnabler.git
Notfalls kann man die Sourcen auch als ZIP-Datei herunterladen. Letzteres muß natürlich erst noch ausgepackt werden.
Zum Bauen ist das Build-Tool Maven erforderlich, das gegebenenfalls noch installiert werden muss.
Um den Smart Appliance Enabler ohne Web-Oberfläche zu bauen, ruft man Maven im Verzeichnis SmartApplianceEnabler wie folgt auf:
mvn clean package
Soll der Smart Appliance Enabler mit Web-Oberfläche gebaut werden, muss das Maven-Profil web
aktiviert werden:
mvn clean package -Pweb
Beim erstmaligen Aufruf von Maven werden dabei alle benötigten Bibliotheken aus dem offiziellen Maven-Repository heruntergeladen. Das Bauen war nur dann erfolgreich, wenn BUILD SUCCESS erscheint! In diesem Fall findet sich die Datei SmartApplianceEnabler-*.war
im Unterverzeichnis target
.
In der Regel ist es nicht erwünscht, dass der Sunny Home Manager die für die Entwicklung verwendete SAE-Instanz (in der IDE oder auf einem Entwicklungs-Raspi) per UPnP "entdeckt" und die Geräte übernimmt. Deshalb kann das UPnP des SAE mit einem Property deaktiviert werden:
-Dsae.discovery.disable=true
Normalerweise kann aus Sicherheistgründen nur lokal auf den Entwicklungs-Web-Server zugegriffen werden. Manchmal ist es sinnvoll, diese Einschränk aufzuheben um z.B. mit dem Handy auf den Entwicklungs-Web-Server zuzugreifen. Dazu muss der Entwicklungs-Web-Server wie folgt gestartet werden:
$ ng serve --host 0.0.0.0 --disable-host-check
Zum Einschalten eines Gerätes eignet sich folgender Befehl, wobei die der Parameter RecommendedPowerConsumption
nur für Wallboxen relevant ist:
curl -X POST -d '<EM2Device xmlns="http://www.sma.de/communication/schema/SEMP/v1"><DeviceControl><DeviceId>F-00000001-000000000099-00</DeviceId><On>true</On><RecommendedPowerConsumption>6000</RecommendedPowerConsumption></DeviceControl></EM2Device>' --header 'Content-Type: application/xml' http://raspi:8080/semp
Zum Ausschalten eignet sich der folgende Befehl:
curl -X POST -d '<EM2Device xmlns="http://www.sma.de/communication/schema/SEMP/v1"><DeviceControl><DeviceId>F-00000001-000000000099-00</DeviceId><On>false</On></DeviceControl></EM2Device>' --header 'Content-Type: application/xml' http://raspi:8080/semp
Unter Verwendung des lokalen Browsers werden die Tests wie folgt gestartet:
$ ./node_modules/.bin/testcafe chrome "src/*.spec.ts"
Running tests in:
- Chrome 92.0.4515.159 / Linux 0.0
Settings
✓ Modbus
Wallbox go-eCharger
✓ Create appliance with interruptions allowed without timing specification
✓ Create HTTP meter
✓ Create HTTP control
✓ Add electric vehicle
✓ Create Schedule with SOC request from friday to sunday
Wallbox mit PhoenixContact-Ladecontroller
✓ Create appliance with interruptions allowed without timing specification
✓ Create Modbus meter
✓ Create Modbus control
✓ Create Schedule with nightly energy request
Fridge
✓ Create appliance
✓ Create HTTP meter
✓ Create always-on-switch
Heat pump
✓ Create appliance with interruptions allowed and min/max on/off timings
✓ Create S0 meter
✓ Create GPIO switch
Pump
✓ Create appliance with interruptions allowed without timing specification
✓ Create Modbus meter with specific poll interval and all notifications enabled
✓ Create Modbus control with selected notifications enabled
Washing Machine
✓ Create appliance
✓ Create HTTP meter with specifc poll interval
✓ Create HTTP switch with starting current detection
✓ Create Schedules for weekdays and weekend
23 passed (3m 02s)
Um mehr Informationen (z.B. CSS-Selectoren) zu sehen, muss DEBUG=true
gesetzt werden:
$ DEBUG=true testcafe chrome "src/washingmachine.spec.ts"
Running tests in:
- Chrome 81.0.4044.92 / Linux 0.0
Washing Machine
Selector: input[formcontrolname="id"]
Selector: input[formcontrolname="vendor"]
Selector: input[formcontrolname="name"]
Selector: mat-select[formcontrolname="type"]
Open select ...
Option selector: mat-option[ng-reflect-value="WashingMachine"]
Option selector exists= true
clicked
...
Zur Ausführung der Tests in BrowserStack werden die Tests wie folgt gestartet:
$ node_modules/.bin/testcafe "browserstack:[email protected]:Windows 10" "src/aa_settings.spec.ts"
Running tests in:
- Chrome 92.0.4515.107 / Windows 10 (https://automate.browserstack.com/builds/a3d339b91d11e8b07134e05b1cb29050a74dfb64/sessions/f8f5d223d8317b22e989cf9f98f501e9bea56901)
Settings
✓ Modbus
1 passed (17s)
... auch mit mehreren Browsern:
axel@p51:/data/IdeaProjects/SmartApplianceEnabler/src/test/angular$ testcafe "browserstack:[email protected]:Windows 10,browserstack:[email protected]:Windows 10" "src/heatpump.spec.ts"
Running tests in:
- Chrome 69.0.3497.92 / Windows 10 (https://automate.browserstack.com/builds/9be7af7e23e9e7a63ea57062980ddffdcbc03f8e/sessions/e3c72a4aa3df464416f6b82063e6fec62e108055)
- Firefox 71.0 / Windows 10 (https://automate.browserstack.com/builds/9be7af7e23e9e7a63ea57062980ddffdcbc03f8e/sessions/07bfbba39b44bfe5ed7544a2d66c326553ae4d11)
Heat pump
✓ Create appliance
✓ Create meter
✓ Create control
3 passed (48s)
Weitere Infos zur Verwendung von Browserstack mit Testcafe: https://www.browserstack.com/automate/testcafe
Zum Anzeigen der unterstützten Kombinationen eignet sich der folgende Befehl:
$ testcafe -b browserstack
"browserstack:[email protected]:OS X Catalina"
"browserstack:[email protected]:OS X Catalina"
"browserstack:[email protected]:OS X Catalina"
"browserstack:[email protected]:OS X Catalina"
...