Difference between revisions of "Volkszähler"

From BITPlan Wiki
Jump to navigation Jump to search
 
(15 intermediate revisions by the same user not shown)
Line 2: Line 2:
 
* https://wiki.volkszaehler.org/software/releases/start
 
* 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

Install from Image

VzLogger

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