Was haben wir vor?
Wir haben bereits die Tasmota Steckdosen kennen gelernt und verwenden sie für das Ein/Ausschalten von Geräten. Nun wollen wir interessehalber auch unsere restlichen Steckdosen aktivieren.
Mit einem Skript wollen wir uns die täglichen Daten auslesen. Es soll um ~1h laufen und die Werte vom Vortag wegspeichern.
Die Daten speichern wir uns dann in unserer Mariadb ab – daraus können wir wieder ein paar Charts erstellen und so einen Überblick über den Stromverbrauch von Geräten schaffen.
Steckdosen aktivieren
Das Einrichten, kalibrieren etc. wurde bereits hier beschrieben: https://www.bi4you.org/artikel/smarte-steckdose-mit-shell-skripten-steuern/
Das müssen wir auch wieder für die neu hinzu gekommenen Steckdosen machen.
Tests
Wir wollen uns nur die täglichen Werte wegspeichern. Auf der Wiki Seite werden wir bei den Commands auch fündig:
https://tasmota.github.io/docs/Commands/#power-monitoring
Mit der cmnd=EnergyTotal Abfrage über curl bekommen wir die Energiewerte. Die IP der Tasmota Steckdose setzen wir mit T_IP=“192.168.42.50″:
Hier schneiden wir mit cut den Yesterday Wert heraus, da uns nur dieser interessiert:
curl -s http://${T_IP}/cm?cmnd=EnergyTotal |cut -d „,“ -f2 |cut -d „:“ -f2
Zusätzlich werden wir uns auch den Namen der Steckdose abspeichern mit
curl -s http://${T_IP}/cm?cmnd=Status |cut -d „\““ -f8
→ So weit hätten wir jetzt unsere Befehle, die wir verwenden wollen – zusätzlich werden wir noch versuchen, in unser Skript eine Function für das Abfrage der Namen/Werte einzubauen.
Mariadb/Doris Tabelle
Für unser Vorhaben benötigen wir nur eine kleine Tabelle mit diesen 3 Feldern:
Anlegen können wir sie mit dem create statement:
CREATE TABLE bme280.tasmota_energy
(
Datum DATE NULL,
TasmotaName VARCHAR(255) NULL,
Energie DECIMAL(10,6) NULL,
PRIMARY KEY (Datum,TasmotaName)
);
Da wir die Daten dann auch wieder in unsere Doris Installation übernehmen wollen, legen wir hier auch die Tabelle an:
CREATE TABLE bme280.tasmota_energy
(
Datum DATE NULL,
TasmotaName VARCHAR(255) NULL,
Energie DECIMAL(10,6) NULL,
)
UNIQUE KEY (Datum, TasmotaName)
DISTRIBUTED BY HASH(Datum) BUCKETS 1
PROPERTIES(„replication_num“ = „1“);
Shell Skript
Name: get_tasmota_energy.sh
In unserem LogFile wollen wir uns eventuelle Verbindungsprobleme mitschreiben.
Da es unter /tmp liegt und nach einem reboot weg ist, werden wir uns die Datei anlegen, wenn es sie nicht gibt:
#!/bin/bash
#set & create log file with header if not exists
LOG_FILE=/tmp/tasmota_energy.log;
if [[ ! -f ${LOG_FILE} ]]
then
echo "Datum;Tasmota_IP;Message;Loop" > ${LOG_FILE};
fi;
Da wir uns den gestrigen Tag auslesen, setzen wir die DATE-Variable auf Gestern:
#yesterday
DATE=`date -d '1 day ago' +"%Y%m%d"`;
Unsere Tasmota IP’s speichern wir als NET und ADRESSES getrennt ab. Sollten wir neue Geräte hinzufügen, müssen wir nur den Eintrag unter TASMOTA_IP_ADRESSES ergänzen:
#Tasmota IPs
TASMOTA_IP_NET="192.168.42.";
TASMOTA_IP_ADRESSES="50 51 52 53 70 71 73";
Die Function GetTasmotaNameEnergy liefert uns entweder den Namen oder den Tageswert zurück, je nachdem welchen Übergabewert wir mitgeben.
Sollte eine Tasmota Steckdose netzwerkmässig nicht erreichbar sein, warten wir 10 Sekunden und probieren es nochmal (maximal 3x).
Wenn sie dann noch immer nicht erreichbar ist, schreiben wir uns das in unser LOG_FILE weg (und haben für diese eine Steckdose keine Werte):
function GetTasmotaNameEnergy {
FUNC=$1;
IP=$2;
LOOP=0;
TasmotaUrl="curl -s http://${IP}/cm?cmnd=";
case ${FUNC} in
"NAME")
TasmotaUrl+="Status";
TasmotaUrlCut="cut -d "\"" -f8";
MESSAGE="No Connection to Tasmota reading Name";;
"ENERGY")
TasmotaUrl+="EnergyTotal";
TasmotaUrlCut="cut -d "," -f2";
TasmotaUrlCut2="cut -d ":" -f2";
MESSAGE="No Connection to Tasmota reading Energy";;
esac
TasmotaNameEnergy=`curl -s --connect-timeout 2 ${TasmotaUrl}`;
while [[ -z ${TasmotaNameEnergy} ]]
do
if [[ ${LOOP} -eq 3 ]]
then
echo "${DATE};${IP};${MESSAGE};${LOOP}" >> ${LOG_FILE};
exit 0;
fi
let LOOP++;
sleep 10;
TasmotaNameEnergy=`curl -s --connect-timeout 2 ${TasmotaUrl}`;
done
case ${FUNC} in
"NAME")
TasmotaNameEnergyFinal=`echo ${TasmotaNameEnergy} | ${TasmotaUrlCut}`;;
"ENERGY")
TasmotaNameEnergyFinal=`echo ${TasmotaNameEnergy} | ${TasmotaUrlCut} |${TasmotaUrlCut2}`;;
esac
echo ${TasmotaNameEnergyFinal};
}
In dieser for-Schleife gehen wir unsere einzelnen IP-Adressen durch, holen uns die Namen/Werte von unserer Function und schreiben sie in eine temporäre csv Datei:
#get name & energy from tasmota, write it to csv
for i in $(echo $TASMOTA_IP_ADRESSES); do
read TASMOTA_NAME < <(GetTasmotaNameEnergy "NAME" "${TASMOTA_IP_NET}${i}");
read TASMOTA_ENERGY < <(GetTasmotaNameEnergy "ENERGY" "${TASMOTA_IP_NET}${i}");
echo "${DATE};${TASMOTA_NAME};${TASMOTA_ENERGY}" >> /tmp/tasmota_energy_tmp.csv;
done
Als letzten Schritt holen wir uns das Datum aus unserer temporären csv Datei, schreiben die Werte in eine neue csv Datei und importieren diese dann mit mariadb-import in unsere Tabelle:
#import $DATE from csv
grep ${DATE} /tmp/tasmota_energy_tmp.csv | sed 's/;;/;\\N;/g' |sed 's/;$/;\\N/g' > /tmp/tasmota_energy.csv;
mariadb-import --lines-terminated-by='\n' --fields-terminated-by=';' --verbose --local -hlocalhost -ubme280 -pbme280 bme280 /tmp/tasmota_energy.csv #>> /tmp/tasmota_energy_mariadb.log;
Cronjob aktivieren
Unseren cronjob für das Skript lassen wir jeden Tag einmalig um 1:11 laufen:
Übernahme in die Doris Tabelle
Die Datenübernahme in unsere Doris Installation erweitern wir um einen neuen Eintrag, nachdem wir die Daten initial übernommen haben:
mysql -h pi5b -P 9030 -ubme280 -pbme280 -e ‚insert into bme280.tasmota_energy select * from asusn100_mysql.bme280.tasmota_energy where Datum > (select max(Datum) from bme280.tasmota_energy);‘
Charts
Unsere neue Tabelle können wir in unserer Superset Installation als neues physikalisches Dataset einhängen:
Als Charts können wir uns die bisherigen Daten z.B. als Smooth-Line darstellen:
Als Bar Chart können wir uns die einzelnen Datensätze auch als stacked Bars anzeigen lassen – so sehen wir auch gleich die Tagessummen:
Fazit
Unser kleines Tasmota Monitoring ist am Laufen. Die Tageswerte werden in unsere Mariadb gespeichert und wir können mit unseren Charts die täglichen Werte betrachten.
Natürlich ist es etwas übertrieben den Monitor, PC und unseren Mini Streaming PC (Asrock-N100) separat zu überwachen – das könnten wir zukünftig auf eine Steckerleiste zusammenfassen und die freien Tasmota Steckdosen für andere Geräte einsetzen.
Generell ist es allerdings gut mal zu sehen, welche Geräte wie viel Strom so über den Tag benötigen und wo wir vielleicht noch Strombedarfsoptimierungen vornehmen können.

