Hitze Index berechnen im IoBroker

Jetzt wo es wieder wärmer wird ist eine Kennzahl wieder wichtig: Der Hitze Index – die gefühlte Wärme. Dieser berechnet sich aus der Temperatur und der Luftfeuchte. Je feuchte es ist umso wärmer fühlt es sich an. Jedenfalls bei „hohen“ Temperaturen.

Hitze Index berechnen im IoBroker

Hitze Index berechnen im IoBroker

Daneben gibt es noch den WindChill-Faktor wo die Windgeschwindigkeit eine Rolle spielt.

Die untere Formel für den Hitzeindex in Grad Celsius bzw. Grad Fahrenheit hat eine Genauigkeit von ±0,7 °C bzw. ±1,3 °F. Sie ist bei Temperaturen von mindestens 26,7 °C bzw. 80 °F und einer relativen Luftfeuchtigkeit von mindestens 40 % anwendbar. Als Variablen sind für ϑ die Temperatur in °C bzw. °F und für  die relative Luftfeuchtigkeit in % einzusetzen.

Hitze Index berechnen im IoBroker
Quelle: Wikipedia

 

Über den „Skript“-Adapter im IoBroker lasse ich nun aller 5min den Hitzeindex für Innen und außen berechnen.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function Start() {
BerechneAussen();
BerechneInnen();
}function BerechneHitzeIndex(temp, hum){
var t =temp
var f = hum;var t2 = Math.pow(t,2);
var f2 = Math.pow(f,2);

var r =
-8.784695 + 1.61139411*t + 2.338549*f - 0.14611605*t*f - 0.012308094*t2
- 0.016424828*f2 + 0.002211732*t2*f + 0.00072546*t*f2 - 0.000003582*t2*f2;

return r;
}

function BerechneInnen(){
var t = parseFloat( getState("netatmo.0.Wetterstation.Innen_Wetterstation.Temperature.Temperature").val);
var f =parseFloat( getState("netatmo.0.Wetterstation.Innen_Wetterstation.Humidity.Humidity").val);
var r = BerechneHitzeIndex(t,f);
setState("0_userdata.0.Hausdaten.Klima.HeatIndex_Innen",r.toFixed(1));
}

function BerechneAussen(){
var t = parseFloat( getState("netatmo.0.Wetterstation.Aussen_Wetterstation.Temperature.Temperature").val);
var f =parseFloat( getState("netatmo.0.Wetterstation.Aussen_Wetterstation.Humidity.Humidity").val);
var r = BerechneHitzeIndex(t,f);
setState("0_userdata.0.Hausdaten.Klima.HeatIndex",r.toFixed(1));
}

schedule('*/5 * * * *',function(){
Start();
});
Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , | Schreib einen Kommentar

IOBroker´s Schreibvolumen reduzieren

Der IOBroker ist eine coole Software um die vielfältigsten Systeme zu vereinen. Dazu rufen Adapter die Daten ab und stellen Kommandos zum steuern bereit. Die Daten werden dabei hierarisch gespeichert. Die Persistierung ist dabei sehr simple. Das Datenobjekt wird als JSON auf die Platte geschrieben. Bei vielen tausend Datenpunkten wird diese Datei aber recht groß und viele Schreibvorgänge erzeugen „Traffic“.

IOBroker´s Schreibvolumen reduzierenDas wäre nicht unbedingt das Problem, meine NVME kann das locker ab. Aber was ich in den Statistiken dann gesehen habe ich das Schreibvolumen auf die Platte:

IOBroker´s Schreibvolumen reduzierenUnd Schreibvorgänge sind nicht gut für die Lebensdauer der Festwertspeicher.
Also ging ich auf Suche und sah, dass ioBroker zyklich die objects.json speichert die 50MB umfasste. Mittels dem Programm iotop konnte man in der kumulierenden Ansicht sehen, dass schnell GigaBytes an Daten zusammen kommen.

Die Lösung

Eine Möglichkeit wäre natürlich ein träges Dateisystem was als Cache fungiert. Aber besser ist das „Backend“ vom IOBroker zu ändern. Das kann man umstellen auf CouchDB oder auch redis. 

Meine Wahl fiel auf redis da es „Leichtgewichtiger“ ist. Was ioBroker nur leider noch nicht kann bzw. ich noch nicht gefunden habe, ist die Möglichkeit zur Authentifizierung gegenüber redis. Auth per Token geht leider nicht. Da muss ich mal noch forschen. Gerade für den Multihostbetrieb brauch man eine geschützte Datenbank.

Die Umstellung

Installation redis

$ sudo apt update 
$ sudo apt install redis-server

Durch die Problematik mit der Auth empfiehlt sich eine Installation auf der ioBroker Maschine. 

Redis ist in dem Moment noch nicht „systemverwaltet“ das sollte man in der /etc/redis/redis.conf anpassen:

IOBroker´s Schreibvolumen reduzieren

sudo systemctl restart redis.service

Danach kann man den Status abfragen:

sudo systemctl status redis

Jetzt kann man testen:IOBroker´s Schreibvolumen reduzierenUmstellung ioBroker

Als ersten muss man ioBroker mit stop beenden. Man kann auch mit „pkill io“ alles schnell beenden 🙂

dann startet man das custom setup und trägt die Daten ein

iobroker setup custom
Type of objects DB [(f)ile, (c)ouch, (r)edis], default [file]: r
Host / Unix Socket of objects DB(file), default[127.0.0.1]: >ENTER
Port of states DB (redis), default[6379]: >ENTER
Type of states DB [(f)file, (r)edis], default [file]: r
Host / Unix Socket of states DB (redis), default[127.0.0.1]: >ENTER 
Port of states DB (redis), default[6379]: >ENTER
Data directory (file), default[../../../iobroker-data/]: >ENTER
Host name of this machine [iobroker]: >ENTER
creating conf/iobroker.json

Es folgt die Migration von File auf redis. Mit den ganzen Dateien kann das schon 10min dauern bei größeren Installationen.

Danach den iobroker wieder mit start starten und mit iobroker status kontrollieren ob alles läuft:

IOBroker´s Schreibvolumen reduzieren

Im Redis Client kann man mit „keys *“ sich auch alle Keys auflisten lassen die es gibt. Bei mir etwas über 150.000 – das ist schon Heftig

Endresultat

Was hat´s nun gebracht?

IOBroker´s Schreibvolumen reduzierenDie Schreibvorgänge sind erstmal massiv weniger geworden – Ziel erreicht. Aber auch die CPU Last hat sich gebessert:

IOBroker´s Schreibvolumen reduzieren

Der Disk IO ist fast auf 0, dafür mehr Net IO und RAM Auslastung ist auch etwas gesunken am ioBroker.

Auf dem VM Host sieht man „etwas“ weniger CPU – aber der redis benötigt natürlich auch etwas CPU Leistung. Aber dadurch, dass die Schreibvorgänge auf die NVME nun drastich weniger sind ist das Ziel erreicht.

Fazit

Ich denke mal, dass auch viele Raspberry Pi Besitzer auf redis als Backend umschalten sollten um die SD Karte zu entlasten. In meinem Beispiel wurden im Monat Mai 10TB an Daten geschrieben – sicher nicht alles der ioBroker aber ganz bestimmt ein Großteil.

Hinweise / Links:

  • Redis selbst speichert die Daten auch (Siehe „save“ in der config)
  • IOBroker speichert (backup) weiter die Daten – aber nicht mehr so oft.
  • redis Installieren => Link
  • Redis im Bereich Multihost in der IoBroker Doku Link
Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , , , | Schreib einen Kommentar

Xiaomi Aqara Cube mit NodeRed + Google Sheets

Cube + NodeRed + Google Sheets = Zeiterfassung Pro

Im PanOffice (Pandemie Office trifft’s eher als Home-Office) möchte man seine Arbeitszeit im Auge behalten und muss auf verschiedene Situationen „schnell“ reagieren. So war es nun der Wunsch von mir die Arbeitszeit zu erfassen – ohne ständig auf die Uhr zu schauen und Zeiten zu schreiben. Vorhandene Lösungen waren mir dann aber zu teuer 😉

Ich will also die aktuelle Aufgabe auf dem Würfel oben sehen und wenn sich was ändert den Würfel einfach auf die Aufgabe drehen. Ich habe da jetzt z. B. Freizeit, Arbeit, Meeting und Pause aktuell. 

Xiaomi Aqara Cube mit NodeRed + Google Sheets

Was der Würfel leider nicht erkennt ist es, wenn man ihn aufnimmt und auf eine andere Fläche stellt. Der Lagesensor reagiert dann nicht – man muss ihn richtig von A nach B kippen. Man kann den Würfel aber auf den Tisch stellen und schieben oder 2x klopfen. 🙂

Den Cube von Xiaomi habe ich bei EBay für 12,08€ gekauft – dauert nur rund 4 Wochen.

Den Cube habe ich über DeConz (ZigBee USB Stik) als Schalter eingebunden:

Dazu muss man nur den Deckel mit dem mitgelieferten Metallteil öffnen – das geht etwas schwer aber durchhalten – es klappt 🙂 Dann einfach den Link Button drücken und etwas Geduld haben.

Ganz wichtig zu wissen ist jetzt, dass DeConz das Gerät 2x publiziert. Im Node Red kann man die leider nicht unterscheiden:

Xiaomi Aqara Cube mit NodeRed + Google Sheets

Hier kann man nun leider nur probieren was man für Daten bekommt. Es gibt immer das „buttonevent“ und die gesture. Ein Gerät liefert Daten zur Lage und was mit dem Würfel gemacht wird und das zweite Gerät liefert Daten wenn das Gerät gedreht wird.

Xiaomi Aqara Cube mit NodeRed + Google Sheets

Würfelfelder

Xiaomi Aqara Cube mit NodeRed + Google Sheets

Darstellung im Web Phoscon

zur Lage

Es gibt folgende Gesten:

  • 1 wedeln
  • 2 in die Luft geworfen ==> button event 7008
  • 3 kippen
  • unbekannt
  • 5 status stehen/ schieben
  • 6 klopfen 2x

Das Buttonevent ist immer eine 4-stellige Zahl – interessant ist aber nur die 1. und 4. Stelle. so kommt z.B. die Zahl 1002 mit geste 3 => der Würfel zeigt nun die Fläche 1 und vorher war die Fläche 2 aktiv. 

Ein Sonderfall ist die Fläche 7. Schüttelt man den Würfel kommt 7007. Wirft man den Würfel in die Luft kommt 7008. Klopft man den Würfel 2x auf den Tisch (nicht in der Hand halten!!) kommt die aktuelle Fläche 2x  also z.b.  3003 oder 4004.

Nach dem Anschalten kommt 7000 (Ruhemodus).

Schiebt man den Würfel horizontal kommt zur Geste 5 das buttonevent  5000 oder z.B. 1000. Hier wird also die aktuelle Fläche (1. Stelle) geliefert und die vorherige Fläche ist 0.

Zur Drehung

wenn der Würfel auf dem Tisch liegt kann man ihn links und rechts drehen (z.b. für Helligkeit oder Lautstärke). Als Buttonevent erhält man die Angabe wie stark der Würfel gedreht wurde in Grad aber mit Faktor 100. Wenn der Wert 4324 kommt, bedeutet dies der Würfel wurde um 43,24° nach rechts gedreht. Ein negativer Wert bedeutet nach links.

Zusätzlich zeigt die Geste 7 (rechts) und 8(links) an in welche Richtung gedreht wurde.

 

Node Red

Im Node Red habe ich nun also 4 DeConz Adapter die mir von jedem Zauberwürfel den buttonevent und gesture liefert. Die Drehung nutze ich aktuell noch nicht.

Aus der Lage extrahiere ich durch simple Mathematik die aktuelle Fläche und die vorherige Fläche (letztes nutze ich auch noch nicht). Der Fläche habe ich für mich Aufgaben zugeordnet und bis auf die 7 nutze ich alle.

Xiaomi Aqara Cube mit NodeRed + Google Sheets

Node Red selbst schreibt über den node-red-contrib-google-sheets Adapter die Daten zu Google Tabellen. Das Einrichten ist etwas „tricky“ aber in der README erklärt. Was nicht drinnen steht, ist dass man in dem Projekt noch die API für Sheets (Tabellen) aktivieren muss. Das kann man aber nachträglich noch machen und die Debug Console zeigt hilfreiche Fehlermeldungen.

Die Payload Merge Funktion hier sammelt die Payload Objekte und gibt sie als vereintes Objekt nach einer Zeit X weiter. Also 1. Objekt lautet { aktuell: 1, vorheriges: 2} und das 2. Objekt {geste: 3} dann kommt am raus: { aktuell: 1, vorheriges: 2, geste: 3}. Node Red Code hier: payload merge.

Xiaomi Aqara Cube mit NodeRed + Google Sheets

 

Ich verwende in dem Adapter dann die „Append Row“ Funktion um eine neue Zeile anzufügen. Für mich reicht hier die aktuelle Fläche und die Uhrzeit mit sekunden. Folgt ein weiteres Event, weiß ich ja wie lange die andere Fläche aktiv war. 

Da beim einfügen der Zeile wird nicht einfach die letzte Zeile beschrieben, sondern wirklich eine Zeile eingefügt. Ich kann somit in der Tabelle keine Formeln in die z.B. 3. oder 4. Spalte setzen. Node Red muss die mit einfügen. Einerseits möchte ich aber das Ende in einer Zeile stehen haben und 2. die Dauer daraus berechnen. Für weitere Berechnungen benötige ich noch das Datum ohne Uhrzeit:

Xiaomi Aqara Cube mit NodeRed + Google SheetsDafür benötigt man noch 3 Formeln. Da wir nicht wissen in welcher Zeile wir sind benötigt man die Funktion INDIREKT mit RC-Notation.

Bevor man die Daten nun also an Excel senden kann muss man ein 2-Dimensionales Array erschaffen. Eine Liste von Zeilen also. Jedes Element ist eine Spalte. Formeln können direkt übergeben werden.

Xiaomi Aqara Cube mit NodeRed + Google SheetsHier wird nun jeweils das Start-Datum des Nächsten Events als Ende genommen. Wenn das da ist wird die Differenz berechnet und das Datum gebildet. 

Xiaomi Aqara Cube mit NodeRed + Google SheetsIn meinem Beispiel lass ich das Tablett noch die aktuelle Tätigkeit sprechen mittels Text-To-Speech was der Fully Kiosk Browser super per API kann.

Noch als Tipp: Nach dem Append to Row liefert der GSheet Adapter noch Informationen wo er die Zeile eingefügt hat. Damit kann man dann noch mehr machen 🙂

Xiaomi Aqara Cube mit NodeRed + Google SheetsDen Node Red Code gibt es hier Zeiterfassung Node Red

Google Skills

Jetzt muss man das ganze ja noch in Tabelle / Excel auswerten was man da an Daten hat.

Zuerst erstellen wir eine Liste von den Tagen die erfasst wurden. Mit der Funktion UNIQUE bekomme ich alle Elemente und SORT zeigt mir diese in der Spalte noch an

=SORT(UNIQUE(Rohdaten!E2:E40035);1;TRUE

Zu dem Datum kann ich nun die Arbeitszeiten raussuchen mit einer SUMIFS Funktion. Da die nur UND Verknüpfungen kennen muss man jedes Event einzeln zählen. Daher hier mehrere SUMIFS addiert.

=IF(B2<>""; SUMIFS(Rohdaten!$D$2:$D$10033;Rohdaten!$E$2:$E$10033;B2;Rohdaten!$B$2:$B$10033;5)+SUMIFS(Rohdaten!$D$2:$D$10033;Rohdaten!$E$2:$E$10033;B2;Rohdaten!$B$2:$B$10033;6);"")

Alternativ kann man hier auch die Pausen berechnen – also das jeweilige Event.

Ich berechne aus dem Datum dann noch die Kalenderwoche und beginne das Spiel dann noch einmal und zähle zu der Woche (vorher ja zum Datum) die Stunden und kann so die Wochenarbeitszeit berechnen.

Die Funktion INDIREKT kennt Excel nun nicht. Ich stelle aber trotzdem mal hier den Export der Sheets Datei bereit. Da kann man die Formeln mal sehen und vielleicht auch wieder reimportieren nach Excel.

Zeiterfassung.xlsx

Veröffentlicht unter Heimautomatisierung | Verschlagwortet mit , , , , , , , , , , , | Schreib einen Kommentar

Proxmox LXC HDD vergrößern

Irgendwann kann es dann doch passieren, dass der LXC Container von Proxmox zu klein wird. Dann muss man die Festplatte vergrößern. Das geht aber etwas anders als bei einer VM. Proxmox bietet hier für LXC-Container den Befehl pct an.

Proxmox LXC HDD vergrößern

Wie ihr seht, könnt ihr mit pct alles mögliche steuern – wäre sicher später mal noch interessant . 🙂

Ausgehend von einer Festplatte (rootfs) und der Container ID 101 würde unser Befehl also lauten:


1
pct resize 101 rootfs 20G

Wichtig: Vorher Backup machen

Veröffentlicht unter Linux-Welt | Verschlagwortet mit , , , , , | Schreib einen Kommentar

PiHole mit eigenem Hostnamen/ Subdomain

Für meine Dienste nutze ich traefik als Reverse-Proxy. Hier ist Let´s Encrypt von Haus aus mit dabei und ich muss mich um sowas nicht auch noch kümmern.

PiHole habe ich jetzt nicht mehr im Docker laufen, sondern auf dem ProxMox in einer VM. Beim Dockercontainer kann man den Virtuell Host einfach angeben – aber wenn man PiHole lokal installiert gibt es dafür leider keine Option. Hier muss man nun etwas Code anpassen

PiHole mit eigenem Hostnamen/ Subdomain
/var/www/html/pihole/index.php

Hier muss man nur den Text „pi.hole“ in Zeile 53 anpassen auf die Subdomain die man nutzen möchte. Die Hochkommas müssen bleiben. Und dann müsste das so aussehen:

PiHole mit eigenem Hostnamen/ Subdomain
Veröffentlicht unter Blogroll | Verschlagwortet mit , | Schreib einen Kommentar