Difference between revisions of "Volkszähler"
Jump to navigation
Jump to search
(16 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
* https://www.volkszaehler.org/ | * https://www.volkszaehler.org/ | ||
+ | * https://wiki.volkszaehler.org/software/releases/start | ||
* https://wiki.volkszaehler.org/howto/raspberry_pi_image | * https://wiki.volkszaehler.org/howto/raspberry_pi_image | ||
+ | * https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/edl21-ehz | ||
+ | * https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf?s[]=ir&s[]=lesekopf | ||
+ | * https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-usb-ausgang | ||
+ | = Install from Image = | ||
+ | == VzLogger == | ||
+ | * https://wiki.volkszaehler.org/howto/raspberry_pi_image | ||
+ | * https://demo.volkszaehler.org/downloads/volkszaehler_latest.zip | ||
+ | <source lang='bash'> | ||
+ | ls -l 2021-02-13-volkszaehler.img | ||
+ | -rw-rw-r--@ 1 wf staff 3665924608 13 Feb 11:42 2021-02-13-volkszaehler.img | ||
+ | </source> | ||
+ | Burn image e.g. https://www.balena.io/etcher/ | ||
+ | |||
+ | === First Login === | ||
+ | <source lang='bash'> | ||
+ | /usr/bin/xauth: file /home/pi/.Xauthority does not exist | ||
+ | |||
+ | SSH is enabled and the default password for the 'pi' user has not been changed. | ||
+ | This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password. | ||
+ | |||
+ | |||
+ | Wi-Fi is currently blocked by rfkill. | ||
+ | Use raspi-config to set the country before use | ||
+ | </source> | ||
+ | Follow instructions e.g. raspi-config - bind address for mysql, localization ... | ||
+ | === WLAN === | ||
+ | use raspi-config | ||
+ | see https://raspberrypi.stackexchange.com/a/123724/11220 | ||
+ | === readmeter === | ||
+ | if you install the readmeter script below in the pi users's bin directorey you can simply call | ||
+ | <source lang='bash'> | ||
+ | readmeter | ||
+ | </source> | ||
+ | |||
+ | = Install desktop = | ||
+ | If you'd like to have the desktop configuration for the raspberry that you configured using the Volkzsähler image | ||
+ | you can install the desktop with: | ||
+ | <source lang='bash'> | ||
+ | sudo apt-get install raspberrypi-ui-mods -y | ||
+ | sudo raspi-config # activate desktop via menu | ||
+ | </source> | ||
+ | |||
+ | = Test USB S0 reader = | ||
+ | == readmeter == | ||
+ | === Prerequsite === | ||
+ | you need to install bc for the readmeter script to work | ||
+ | <source lang='bash'> | ||
+ | apt-get install bc | ||
+ | </source> | ||
+ | |||
+ | === readmeter bash script === | ||
+ | <source lang='bash'> | ||
+ | #!/bin/bash | ||
+ | # read and evaluate SML output received from EMH eHZ | ||
+ | |||
+ | getmeter() { | ||
+ | # set serial device | ||
+ | INPUT_DEV="/dev/ttyUSB0" | ||
+ | |||
+ | #set $INPUT_DEV to 9600 8N1 | ||
+ | stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1: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 | ||
+ | |||
+ | SML_START_SEQUENCE="1B1B1B1B0101010176" | ||
+ | METER_OUTPUT__START_SEQUENCE="" | ||
+ | |||
+ | while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ] | ||
+ | do | ||
+ | METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 460 | tr -d '[:space:]'` | ||
+ | METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}") | ||
+ | if [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ]; | ||
+ | then | ||
+ | echo "missed start and trying again..." | ||
+ | sleep 0.1 | ||
+ | #exit 1 | ||
+ | fi | ||
+ | done | ||
+ | |||
+ | echo $METER_OUTPUT | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # match | ||
+ | # 1: prefix | ||
+ | # 2: text | ||
+ | # 3: ofs | ||
+ | # 4: len | ||
+ | # | ||
+ | matchvalue() { | ||
+ | local l_prefix="$1" | ||
+ | local l_text="$2" | ||
+ | local l_ofs="$3" | ||
+ | local l_len="$4" | ||
+ | local l_prefix_len=${#l_prefix} | ||
+ | local l_text_len=${#l_text} | ||
+ | local l_start=0 | ||
+ | let l_max=l_text_len-l_prefix_len | ||
+ | #echo "$l_prefix_len - $l_text_len - $l_max" | ||
+ | while [ $l_start -lt $l_max ] | ||
+ | do | ||
+ | l_part=${l_text:$l_start:$l_prefix_len} | ||
+ | if [ "$l_prefix" = "$l_part" ] | ||
+ | then | ||
+ | let l_start=l_start+l_prefix_len+l_ofs | ||
+ | local l_value_hex=${l_text:$l_start:$l_len} | ||
+ | let l_value=0x${l_value_hex} | ||
+ | # uncomment to debug - but then do not use bc below | ||
+ | # echo ${l_start} | ||
+ | # echo ${l_value_hex} | ||
+ | echo $l_value | ||
+ | return | ||
+ | fi | ||
+ | let l_start=l_start+1 | ||
+ | done | ||
+ | } | ||
+ | |||
+ | # | ||
+ | # get a value from the SML Sequence | ||
+ | # | ||
+ | getvalue() { | ||
+ | local l_prefix="$1" | ||
+ | local l_text="$2" | ||
+ | local l_ofs="$3" | ||
+ | local l_len="$4" | ||
+ | local l_factor="$5" | ||
+ | local l_title="$6" | ||
+ | local l_unit="$7" | ||
+ | #echo "ofs:$l_ofs len: $l_len factor: $l_factor" | ||
+ | METER_180=$(matchvalue "$l_prefix" "$l_text" "$l_ofs" "$l_len") | ||
+ | #echo $METER_180 | ||
+ | VALUE=$(echo "scale=2; $METER_180 / $l_factor" |bc) | ||
+ | echo "$l_title" $VALUE "$l_unit" | ||
+ | } | ||
+ | |||
+ | echo "SML SEQUENCE:" | ||
+ | getmeter | ||
+ | getvalue "77070100010800FF" "$METER_OUTPUT" 20 10 10000 "Meter 1.8.0 (from plant):" "kWh" | ||
+ | getvalue "77070100020800FF" "$METER_OUTPUT" 20 10 10000 "Meter 2.8.0 ( to plant):" "kWh" | ||
+ | #getvalue "77070100010801FF" "$METER_OUTPUT" 20 10 10 "1.8.1" "kW" | ||
+ | #getvalue "77070100010802FF" "$METER_OUTPUT" 20 10 10 "1.8.2" "kW" | ||
+ | #getvalue "77070100020801FF" "$METER_OUTPUT" 20 10 10 "2.8.1" "kW" | ||
+ | #getvalue "77070100020802FF" "$METER_OUTPUT" 20 10 10 "2.8.2" "kW" | ||
+ | </source> | ||
+ | |||
+ | === Example output === | ||
+ | <pre> | ||
+ | ./readmeter | ||
+ | SML SEQUENCE: | ||
+ | missed start and trying again... | ||
+ | 1B1B1B1B0101010176070012028F6A8262006200726301017601010700120C6D78D609080C2AED2D4C4E9F01016337390076070012028F6A836200620072630701770109080C2AED2D4C4E9F070100620AFFFF726201650C6DEC247A77078181C78203FF0101010104454D480177070100000009FF0101010109080C2AED2D4C4E9F0177070100010800FF6401018201621E52FF5600156312070177070100020800FF6401018201621E52FF5600093E97510177070100010801FF0101621E52FF5600156312070177070100020801FF0101621E52FF5600093E97510177070100010802FF0101621E52FF5600000000000177070100020802FF0101621E52FF56000000000001770701000F0700FF0101621B52FF6500001E330177078181C78205FF01726201650C6DEC2501018302D9801652DE264F8D45221BDF3EB993C9083F800F6F1319C9BD7148567D336D72DBB1E5A845CC56C4A3EE32157EF495560101016358FA0076070012028F6A846200620072630201710163529A000000001B1B1B1B1A0376561B1B1B1B0101010176070012028F6A8862006200726301017601010700120C6D78D809080C2AED2D4C4E9F010163797A0076070012028F6A896200620072630701770109 | ||
+ | Meter 1.8.0 (from plant): 35881.42 kWh | ||
+ | Meter 2.8.0 ( to plant): 15509.69 kWh | ||
+ | </pre> |
Latest revision as of 14:31, 14 July 2021
- https://www.volkszaehler.org/
- https://wiki.volkszaehler.org/software/releases/start
- https://wiki.volkszaehler.org/howto/raspberry_pi_image
- https://wiki.volkszaehler.org/hardware/channels/meters/power/edl-ehz/edl21-ehz
- https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf?s[]=ir&s[]=lesekopf
- https://wiki.volkszaehler.org/hardware/controllers/ir-schreib-lesekopf-usb-ausgang
Install from Image
VzLogger
- https://wiki.volkszaehler.org/howto/raspberry_pi_image
- https://demo.volkszaehler.org/downloads/volkszaehler_latest.zip
ls -l 2021-02-13-volkszaehler.img
-rw-rw-r--@ 1 wf staff 3665924608 13 Feb 11:42 2021-02-13-volkszaehler.img
Burn image e.g. https://www.balena.io/etcher/
First Login
/usr/bin/xauth: file /home/pi/.Xauthority does not exist
SSH is enabled and the default password for the 'pi' user has not been changed.
This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password.
Wi-Fi is currently blocked by rfkill.
Use raspi-config to set the country before use
Follow instructions e.g. raspi-config - bind address for mysql, localization ...
WLAN
use raspi-config see https://raspberrypi.stackexchange.com/a/123724/11220
readmeter
if you install the readmeter script below in the pi users's bin directorey you can simply call
readmeter
Install desktop
If you'd like to have the desktop configuration for the raspberry that you configured using the Volkzsähler image you can install the desktop with:
sudo apt-get install raspberrypi-ui-mods -y
sudo raspi-config # activate desktop via menu
Test USB S0 reader
readmeter
Prerequsite
you need to install bc for the readmeter script to work
apt-get install bc
readmeter bash script
#!/bin/bash
# read and evaluate SML output received from EMH eHZ
getmeter() {
# set serial device
INPUT_DEV="/dev/ttyUSB0"
#set $INPUT_DEV to 9600 8N1
stty -F $INPUT_DEV 1:0:8bd:0:3:1c:7f:15:4:5:1: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
SML_START_SEQUENCE="1B1B1B1B0101010176"
METER_OUTPUT__START_SEQUENCE=""
while [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ]
do
METER_OUTPUT=`cat $INPUT_DEV 2>/dev/null | xxd -p -u -l 460 | tr -d '[:space:]'`
METER_OUTPUT__START_SEQUENCE=$(echo "${METER_OUTPUT:0:18}")
if [ "$METER_OUTPUT__START_SEQUENCE" != "$SML_START_SEQUENCE" ];
then
echo "missed start and trying again..."
sleep 0.1
#exit 1
fi
done
echo $METER_OUTPUT
}
#
# match
# 1: prefix
# 2: text
# 3: ofs
# 4: len
#
matchvalue() {
local l_prefix="$1"
local l_text="$2"
local l_ofs="$3"
local l_len="$4"
local l_prefix_len=${#l_prefix}
local l_text_len=${#l_text}
local l_start=0
let l_max=l_text_len-l_prefix_len
#echo "$l_prefix_len - $l_text_len - $l_max"
while [ $l_start -lt $l_max ]
do
l_part=${l_text:$l_start:$l_prefix_len}
if [ "$l_prefix" = "$l_part" ]
then
let l_start=l_start+l_prefix_len+l_ofs
local l_value_hex=${l_text:$l_start:$l_len}
let l_value=0x${l_value_hex}
# uncomment to debug - but then do not use bc below
# echo ${l_start}
# echo ${l_value_hex}
echo $l_value
return
fi
let l_start=l_start+1
done
}
#
# get a value from the SML Sequence
#
getvalue() {
local l_prefix="$1"
local l_text="$2"
local l_ofs="$3"
local l_len="$4"
local l_factor="$5"
local l_title="$6"
local l_unit="$7"
#echo "ofs:$l_ofs len: $l_len factor: $l_factor"
METER_180=$(matchvalue "$l_prefix" "$l_text" "$l_ofs" "$l_len")
#echo $METER_180
VALUE=$(echo "scale=2; $METER_180 / $l_factor" |bc)
echo "$l_title" $VALUE "$l_unit"
}
echo "SML SEQUENCE:"
getmeter
getvalue "77070100010800FF" "$METER_OUTPUT" 20 10 10000 "Meter 1.8.0 (from plant):" "kWh"
getvalue "77070100020800FF" "$METER_OUTPUT" 20 10 10000 "Meter 2.8.0 ( to plant):" "kWh"
#getvalue "77070100010801FF" "$METER_OUTPUT" 20 10 10 "1.8.1" "kW"
#getvalue "77070100010802FF" "$METER_OUTPUT" 20 10 10 "1.8.2" "kW"
#getvalue "77070100020801FF" "$METER_OUTPUT" 20 10 10 "2.8.1" "kW"
#getvalue "77070100020802FF" "$METER_OUTPUT" 20 10 10 "2.8.2" "kW"
Example output
./readmeter SML SEQUENCE: missed start and trying again... 1B1B1B1B0101010176070012028F6A8262006200726301017601010700120C6D78D609080C2AED2D4C4E9F01016337390076070012028F6A836200620072630701770109080C2AED2D4C4E9F070100620AFFFF726201650C6DEC247A77078181C78203FF0101010104454D480177070100000009FF0101010109080C2AED2D4C4E9F0177070100010800FF6401018201621E52FF5600156312070177070100020800FF6401018201621E52FF5600093E97510177070100010801FF0101621E52FF5600156312070177070100020801FF0101621E52FF5600093E97510177070100010802FF0101621E52FF5600000000000177070100020802FF0101621E52FF56000000000001770701000F0700FF0101621B52FF6500001E330177078181C78205FF01726201650C6DEC2501018302D9801652DE264F8D45221BDF3EB993C9083F800F6F1319C9BD7148567D336D72DBB1E5A845CC56C4A3EE32157EF495560101016358FA0076070012028F6A846200620072630201710163529A000000001B1B1B1B1A0376561B1B1B1B0101010176070012028F6A8862006200726301017601010700120C6D78D809080C2AED2D4C4E9F010163797A0076070012028F6A896200620072630701770109 Meter 1.8.0 (from plant): 35881.42 kWh Meter 2.8.0 ( to plant): 15509.69 kWh