# PlusLifeWeb

Dieses kleine PHP-Projekt bietet die Möglichkeit, Tests, die mit einem
[Pluslife-Gerät](https://altruan.de/pages/pluslife-pcr) und dem
[Pluslife Analyzer](https://virus.sucks/) durchgeführt wurden, zu speichern
und später nochmals anzuschauen.

Außerdem können Benachrichtigungen via Webhook an [Home Assistant](https://www.home-assistant.io/)
geschickt werden, um diese weiter zu verarbeiten.

Hierfür wurden folgende Komponenten benutzt:

* [Pluslife Analyzer Displayer von sistason](https://github.com/sistason/pluslife_analyzer_displayer/tree/main):
  Dieses Projekt war der Ausgangspunkt für PlusLifeWeb
* jQuery
* Bootstrap
* Twig
* Chart.js
* PostgreSQL als Datenbank

**Wichtig:**
Es wird dringend davon abgeraten, PlusLifeWeb öffentlich zugänglich zu machen, da keinerlei Authentifizierung
implementiert ist! Jede Person, die PlusLifeWeb aufrufen kann, kann die Testergebnisse anschauen und auch
neue per Webhook hinzufügen!

## Installation

PlusLifeWeb wurde unter Devuan 12 "Bookworm" entwickelt und getestet. Daher sollte es auch unter
Debian 12 funktionieren.

Grundsätzlich wird ein Webserver, z.B. Apache, benötigt.
Die Verbindung zum Webserver muß per HTTPS möglich sein, damit der Webhook von virus.sucks funktioniert.

Folgende PHP-Pakete werden benötigt:

* php-pgsql
* php-twig
* php-json
* php-curl

Zur Installation genügt es, die Dateien in einem Webserver-Verzeichnis abzulegen, in dem PHP funktioniert.

### Datenbank

In PostgreSQL wird eine Datenbanktabelle für die Tests benötigt.

Die Datenbank wird als Benutzer *postgres* angelegt (Als root: `su - postgres`).

```
# createdb plweb
```

Anschließend, weiterhin als Benutzer postgres, das Kommando `psql` aufrufen:

```
# psql plweb
```

Mit folgenden SQL-Kommandos wird dann die Tabelle sowie ein Benutzer angelegt:

```sql
CREATE TABLE tests (
id SERIAL PRIMARY KEY,
timestamp TIMESTAMP NOT NULL,
data JSONB
);

CREATE USER plweb WITH ENCRYPTED PASSWORD 'plweb';

GRANT ALL PRIVILEGES ON DATABASE PLWEB TO plweb;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA PUBLIC TO plweb;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA PUBLIC TO plweb;
```

Das Paßwort ist hier nur *plweb* - es sollte besser ein anderes benutzt werden.

### Konfiguration

In der Datei `config.php` können folgende Parameter eingestellt werden:

```php
$hawebhook = "http://homeassistant:8123/api/webhook/plweb";
$dbconnstring = "host=localhost dbname=plweb user=plweb password=plweb";
$test_url = "https://example.com/plweb/test.php?";
```

Die Variable `hawebhook` enthält die URL des Home Assistant-Webhooks, so wie dieser
von PlusLifeWeb aus (serverseitig) aufgerufen wird.
Wird die Variable leer gelassen (`""`), so wird die Home Assistant-Benachrichtigung deaktiviert.

Die Datenbankkonfiguration ist in `dbconnstring` enthalten. Hier ggf. das Paßwort anpassen.

Die `test_url` zeigt zum Script test.php der PlusLifeWeb-Installation.
Diese URL wird, zusammen mit der ID des fertigen Tests, als Benachrichtigung an Home
Assistant übertragen.

### Pluslife Analyzer (virus.sucks)

Damit PlusLifeWeb auch die Daten des Tests erhalten kann, muß beim [Pluslife Analyzer](https://virus.sucks/pluslife_app/)
eine Webhook-URL eingetragen werden.
Diese findet sich dort unter *Einstellungen*.

Damit die Datenübertragung funktioniert, muß PlusLifeWeb per https erreichbar sein!

Die URL muß zu `webhook.php` zeigen, beispielsweise so:
`https://example.com/plweb/webhook.php`

### Home Assistant

Um die Home Assistant (HA)-Benachrichtigung zu nutzen, muß in HA eine Automatisierung
eingerichtet werden, die per Webhook-Aufruf aktiviert wird.

Diese kann beispielsweise so aussehen:

```yaml
alias: Webhook PlusLifeWeb
triggers:
  - trigger: webhook
    allowed_methods:
      - POST
    local_only: true
    webhook_id: plweb
actions:
  - if:
      - condition: template
        value_template: "{% if trigger.json.url is defined %}true{% endif %}"
    then:
      - action: notify.familie
        metadata: {}
        data:
          message: |-
            {{ trigger.json.message }}
            Klicken, um den Test anzusehen.
          data:
            clickAction: "{{ trigger.json.url }}"
            group: plweb
          title: PlusLifeWeb
    else:
      - action: notify.familie
        metadata: {}
        data:
          message: "{{ trigger.json.message }}"
          title: PlusLifeWeb
          data:
            group: plweb
mode: single
```

**Wichtig:** Der Wert für `webhook_id` ist quasi das Paßwort für den Webhook - es gibt keine weitere
Authentifizierung für den Aufruf des Webhooks. Falls `local_only` auf `false` gesetzt ist, kann der
Webhook auch aus dem Internet aufgerufen werden (sofern HA von dort aus erreichbar ist).
Die Empfehlung wäre, den Webhook nur im lokalen LAN erreichbar zu machen (`local_only: true`) und eine
sichere `webhook_id` zu benutzen.
Dies setzt allerdings voraus, daß PlusLifeWeb und der HA-Server im gleichen lokalen LAN stehen.

Die Benachrichtigung erfolgt im Beispiel an `notify.familie`, eine Benachrichtigungs-Gruppe.
Hier muß eine im eigenen HA vorhandene notify-Entität genutzt werden :)


