#!/bin/bash

# script zum auslesen von 2 Zaehlern "Itron ACE3000 Typ260 
# mit 300Baud 7E1 only
# 1. Zaehler fuer Bezug und Einspeisung
# 2. Zaehler fuer Solaranalge Erzeugung
# Aufruf des Script jede Minute via cron
#
# Berechnung und Uebertragung von Eigenverbrauch und Gesamtverbrauch
# zur Berechung werden die vorhergehenden Werte benötigt
# Speicherung im Filesystem, zum Schutz des SD-Karte im Raspberry Pi
# wird ins tmpfs , hier "/run" geschrieben.

UUID_Z1="d68d8770-e0b6-11e2-a096-65397279e981"
UUID_Z2="317f8d80-e0b7-11e2-ac4f-6be8a34ac71b"
UUID_Z3="4bab70a0-e0b8-11e2-b7a8-6fcce85c1c90"
UUID_E="d0f69c60-e0b5-11e2-9ca1-f11bc18163e0"
UUID_S="9fa04450-e0b6-11e2-a0da-0b205249f669"


# Init ttyUSBx 
stty -F /dev/ttyUSB0 1:4:da7:a30:3:1c:7f:15:4:10:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
#stty -F /dev/ttyUSB1 1:4:da7:a30:3:1c:7f:15:4:10:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0

                                                            # Hack zum Aufwecken der Zähler im Hintergrund
( sleep 1 ; echo -e "\x2f\x3f\x21\x0d\x0a" > /dev/ttyUSB0 ) &

while read -t8 line                                         # warten auf die Zaehlerausgabe
do                                                          # Bestaetigung nach dem Wecken nicht notwendig
  [[ "$line" =~ "1.8.0" ]] && Z1=${line:6:8}                # Wert fuer Bezug
  [[ "$line" =~ "2.8.0" ]] && Z2=${line:6:8}                # Wert fuer Einspeisung
done < /dev/ttyUSB0

                                                                 # Auslesen des 2. Zaehlers
#( sleep 1 ; echo -e "\x2f\x3f\x21\x0d\x0a" > /dev/ttyUSB1 ) &
#while read -t8 line
#do
#  [[ "$line" =~ "1.8.0" ]] && Z2_in=${line:6:8}                 # wird hier nicht benoetigt
#  [[ "$line" =~ "2.8.0" ]] && Z3=${line:6:8}                     # Wert fuer Erzeugung
#done < /dev/ttyUSB1

# Eigenverbrauch ist die Differenz aus Erzeugung - Einspeisung
# da die Zaehler nicht synchon umschalten koennten negative Werte entstehen
# das fuehrt zu starken Anzeigefehlern
# deshalb wird ueberprueft, dass der Eigenverbrauch nicht kleiner als der vorhergehende Wert wird.
#

eigen_old=$(cat /run/eigen_old)
eigen=$(echo "scale=1; ($Z3 - $Z2)" | bc)                       # Eigenverbrauch von PV
[ -z "$eigen_old" ] && eigen_old=$eigen

if [ $(echo "if ($eigen >= $eigen_old) 1 else 0" | bc) -eq 1 ] ; then  # wenn alt - neu negativ
 echo $eigen > /run/eigen_old
else
  eigen=$eigen_old;                                                    # dann alten Wert behalten
fi


summe=$(echo "scale=1; ($Z1 + $eigen)" | bc)                    # Gesamtverbrauch


# Debug
datum=`date`
echo -n "$datum : from:$Z1, to:$Z2, pv:$Z3, mypv:$eigen, myall:$summe" >> /tmp/zaehlerlog
# /Debug

# merken der Werte im Filesystem um unnötige Einträge in der DB zu vermeiden

Z1_old=$(cat /run/Z1)
echo $Z1 > /run/Z1
Z2_old=$(cat /run/Z2)
echo $Z2 > /run/Z2
Z3_old=$(cat /run/Z3)
echo $Z3 > /run/Z3
E_old=$(cat /run/Eigen)
echo $eigen > /run/Eigen
S_old=$(cat /run/Summe)
echo $summe > /run/Summe

# pruefen ob sich die Werte geaendert haben, wenn nicht dann wird auch nichts in die DB geschrieben 

[ "$Z1" == "$Z1_old" ] && Z1=""
[ "$Z2" == "$Z2_old" ] && Z2=""
[ "$Z3" == "$Z3_old" ] && Z3=""
[ "$eigen" == "$E_old" ] && eigen=""
[ "$summe" == "$S_old" ] && summe=""

# Debug , wenn alle Zaehlerstaende unveraendert dann ein "*" anhängen
[ -z "$Z1$Z2$Z3$eigen$summe" ] && echo -n " *" >> /tmp/zaehlerlog
echo >> /tmp/zaehlerlog
# /Debug

# senden der Zaehlerstände an die Middleware wenn notwendig
# statt vzclient ist auch wget oder curl möglich

[ -z "$Z1" ] || /var/www/volkszaehler.org/misc/tools/vzclient --url http://localhost/middleware.php -u $UUID_Z1 add data value=$Z1 > /dev/null
[ -z "$Z2" ] || /var/www/volkszaehler.org/misc/tools/vzclient --url http://localhost/middleware.php -u $UUID_Z2 add data value=$Z2 > /dev/null
[ -z "$Z3" ] || /var/www/volkszaehler.org/misc/tools/vzclient --url http://localhost/middleware.php -u $UUID_Z3 add data value=$Z3 > /dev/null
[ -z "$eigen" ] || /var/www/volkszaehler.org/misc/tools/vzclient --url http://localhost/middleware.php -u $UUID_E add data value=$eigen > /dev/null
[ -z "$summe" ] || /var/www/volkszaehler.org/misc/tools/vzclient --url http://localhost/middleware.php -u $UUID_S add data value=$summe > /dev/null

