Mit der Hilfe eines Aqara Tür und Fenster Sensors ( Reed Kontakt Sensor ) kann am Gaszähler ( G4 RF1) über den Internen Magneten der aktuelle Verbrauch abgelesen werden ( 1 Imp = 0.1m³ ). Eingebunden ist das ganze wie bereits beim digitalen Stromzähler in Home Assistant ( HASSIO ). Dort kann man sich die Verbrauchswerte für die unterschiedliche Zeiten (Tag, Woche, Monat, Jahr) anzeigen lassen.

Benötigte Hardware

Benötigte Software

3D Gehäuse Tinkercad

Aufbau

Gaszähler Typ G4 RF1

Gaszähler G4 RF1

Bei meinem Gaszähler handelt es sich um das Model G4 RF1 von Actaris. 

Das Model G4 RF1 von Pipersberg ist baugleich soweit ich weiß. Daher sollte das Case für den Sensor auch hier passen.

Der Magnet befindet sich hinter der ersten roten Zahl nach dem Komma ( 1imp = 0.1m³ ).

Hassio configuration.yaml

# GASTZÄHLER      
counter:
    gaszaehler:
      initial: 0
      step: 1
      icon: mdi:meter-gas-outline 
# CAN ALSO BE ADDED TO Automation.yaml
automation:
# COUNTER INCREMENT 
- id: '1664298491581'
  alias: increaseCounter
  description: ''
  trigger:
  - type: turned_off
    platform: device
    device_id: c0d6f8ef97c5bffd76e0be955598bcfc
    entity_id: binary_sensor.openclose_8
    domain: binary_sensor
    for:
      hours: 0
      minutes: 0
      seconds: 0
  condition: []
  action:
  - service: counter.increment
    data: {}
    target:
      entity_id: counter.gaszaehler
  mode: single
# COUNTER RESET AT MIDNIGHT
- id: '1664298606458'
  alias: counterReset
  description: ''
  trigger:
  - platform: time
    at: 00:00:00
  condition: []
  action:
  - service: counter.reset
    data: {}
    target:
      entity_id: counter.gaszaehler
  mode: single 
# VIRTUAL SENSOR 
template:
  - sensor:
      - name: "Gaszaehler_m3"
        unit_of_measurement: "m³"
        device_class: energy
        state_class: total_increasing
        state: >
          {% set gas = states('counter.gaszaehler') | int %}
          {{ ((gas) * 0.1) | round(1, default=0) }}
  - sensor:
      - name: "Gaszaehler_kWh"
        unit_of_measurement: "kWh"
        device_class: energy
        state_class: total_increasing
        state: >
          {% set kwh = states('sensor.gaszaehler_m3') | float %}
          {{ ((kwh) * 10.5) | round(1, default=0) }}

# 10.5 NEEDS TO BE CHECKED AT YOUR GAS INVOICE ( Z-ZAHL )

Home Assistant grafische Darstellung

Mit der Hilfe eines ESP32 und eines einfachen IR Moduls kann am Stromzähler der aktuelle Stromverbrauch ausgelesen werden ohne das man den Stromzähler PIN benötigt. Auf der Suche nach einer Alternative zu der doch komplizierten WebServer Lösung bin ich auf die Arduino IoT Cloud Seite gestoßen. Nach kürzester Zeit hatte ich die Daten meines ESP32 + IR Moduls auf dem Handy Bildschirm.

Arduino IoT Cloud Remote App

Arduino IoT Remote App
Die Werte sind so niedrig da mein Solarkraftwerk zu dem Zeitpunkt Strom generiert hat.

Benötigte Hardware

  • ESP32-WROOM-32 D1 mini (AZ-Delivery)
  • IR Modul (TCRT5000) 
  • 3D Drucker + Filament
  • Lötstation mit Equipment
  • Einzeladern

Benötigte Software

Aufbau Gehäuse

Das neue Zählergehäuse findet man hier.

IR Modul TCRT5000 modifikation

Auf dem TCRT5000 befindet sich eine Lesediode und eine Schreibdiode. Die Schreibdiode wird auch als Näherungssensor verwendet wodurch es zu Problemen kommen kann beim Ablesen des Stromzählers. 

In meinem Fall habe ich die hellere (weiße Diode) einfach ausgelötet. In anderen Beiträgen habe ich gesehen, dass auch nur der Vorwiderstand entfernt wurde. 

Den TCRT5000 habe ich am ESP32 an die Pins G14, 5V und GND angeschlossen.

eHz Elektronischer Haushaltszähler

Das Gehäuse aus dem 3D Drucker passt beim eHz Elektronischen Haushaltszähler. Mit zwei Magneten wird das Gehäuse am Zähler befestigt da der Stromzähler Eigentum des Netzbetreibers ist! 

Die rechten beiden IR Dioden werden beim IR Lese-Schreibekopf verwendet (Volkszähler). Dabei wird permanent zwischen den Unterschiedlichen zur verfügung stehenden Zählerständen geschalten und diese ausgelesen (PIN muss beim jeweiligen Netzbetreiber angefragt werden).

Zähler Aufsteckmodul ESP32 + TCRT5000

Einrichten von Arduino IoT Cloud Remote

Nachdem man sich bei Arduino Cloud IoT registriert hat, kann man sich ein neues Projekt mit dem Button “Create” anlegen. Anschließend sind die Felder Devices, Network und Variables auszufüllen. Das Setup von Devices und Network ist eigentlich selbsterklärend, daher werde ich nicht genauer auf diese beiden Punkte eingehen.

Variables

Durch drücken des Add Button kann man eine Variable hinzufügen. In unserem Fall lautet die Variable “Strom”. Als Datentyp verwenden wir einen integer number mit der permission Read only. Bei send value geben wir on change (threshold: 0) an. Das ganze sollte dann so aussehen.

Die Variable Strom wird im Sketch angegeben und automatisch generiert. Das heißt sie muss im Code nicht extra deklariert werden (kann direkt verwendet werden).

Dashboard

Damit wir später an der Handy App das Diagramm zu sehen bekommen müssen wir unter Dashboards ein Chart hinzufügen mit dem Button “Add”. Hier muss man nur noch die Verlinkung zwischen Chart und der Variable Strom herstellen (rechts außen).

Code (Sketch)

/* 
  Sketch generated by the Arduino IoT Cloud Thing "Untitled"
  https://create.arduino.cc/cloud/things/xxxx-xxxx-xxxx-xxxx 

  Arduino IoT Cloud Variables description

  The following variables are automatically generated and updated when changes are made to the Thing

  int strom;

  Variables which are marked as READ/WRITE in the Cloud Thing will also have functions
  which are called when their values are changed from the Dashboard.
  These functions are generated with the Thing and added at the end of this sketch.
*/

#include "thingProperties.h"
#include <time.h>

/* Configuration of NTP */
#define MY_NTP_SERVER "2.europe.pool.ntp.org"
#define MY_TZ "CET-1CEST,M3.5.0,M10.5.0/3"

/* Globals NTP */
time_t now;
tm tm;

/* Sensor TCRT5000 PIN14 */
const int digital_pin = 14;
int state = 0;
int laststate = 1;
double watt = 0;
unsigned int counter = 0;

/* Update Time for Chart */
int period = 60*1000; // 1min
unsigned long time_now = 0;

/* Reset function after page update */
void resetFunc(){
  counter = 0;
  watt = 0;
}

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  // This delay gives the chance to wait for a Serial Monitor without blocking if none is found
  delay(1500); 

  // Defined in thingProperties.h
  initProperties();

  // Connect to Arduino IoT Cloud
  ArduinoCloud.begin(ArduinoIoTPreferredConnection);
  
 /*
     The following function allows you to obtain more information
     related to the state of network and IoT Cloud connection and errors
     the higher number the more granular information you’ll get.
     The default is 0 (only errors).
     Maximum is 4
 */
  setDebugMessageLevel(2);
  ArduinoCloud.printDebugInfo();
  
  /* Time NTP */
  configTime(0, 0, MY_NTP_SERVER); 
  setenv("TZ", MY_TZ, 1); // Set your time zone
  tzset();
  
  delay(1000);
}

void loop() {
  ArduinoCloud.update(); 

  // Impulse counter to watt
  state=digitalRead(digital_pin);
  if ( laststate == 1 && state == 0 )
  {
    counter++;
  }
  laststate = state;

  watt = counter * 6;
  
  if(millis() >= time_now + period){
    time_now += period;
    strom = watt;
    resetFunc();
    Serial.println(strom);
  }
}

/*
  Since Strom is READ_WRITE variable, onStromChange() is
  executed every time a new value is received from IoT Cloud.
*/
void onStromChange()  {
  // Add your code here to act upon Strom change
}

Handy IoT Remote App