Wasseruhr auslesen mit einem ESP32-CAM

Hier meine Einstellungen:


watermeter2

Achtung, von MQTT kommt ein String.
Über ein Mini-Skript wird der in einen Float-Wert umgewandelt.

$wasserzaehler = GetValueString(32903);
$wasser = (float) $wasserzaehler;
SetValueFloat(12547, $wasser);

Gruß Harry

Wichtig ist der mqtt prefix bei der URI. Die Vorgabe ist was anderes bei mir gewesen. Da habe ich auch eine Weile dran gesessen.
grafik

@harry28

vielen dank für deine Hilfestellung, genau so mache ich es auch, wie gesagt ein wenig kenne ich mich aus mit mqtt durch die Zigbee sensoren und durch Tasmota und da klappt das auch immer alles ohne Probleme.

Aktuell bekomme ich diesen Fehler wenn ich einen mqtt Client als neue Instanz hinzufügen möchte.

Unbenannt

@Attain Danke darauf habe ich natürlich geachtet

Hallo zusammen,

habe es nun hinbekommen. Woran es lag habe ich leider nicht rausgefunden, plötzlich ging es einfach.

@Harry28 bei mir ist der Wert schon ohne Mini-Skript da, und wird auch richtig ausgegeben.

Habe jetzt im allgemeinen aber noch mal eine Frage.
Hat schon jemand ein Skript für den Täglichen, Wöchentlichen und Monatlichen Verbrauch oder wie handhabt ihr das?

Ich schreibe seit 20 Jahren die Werte am Monatsersten von Hand in eine EXCEL-Datei und schau mir da dann die Tendenzen für Gas, Wasser und Strom an. Kein Skript in IPS. Früher gab es den Gang in den Keller zum Ablesen, jetzt guck ich halt am PC in IPS und übertrage die Werte.

Eine Idee wäre noch das Schreiben in eine MySQL-Datenbank, aber meine EXCEL-Datei hab ich nun schon so lange und das taugt mir…

Viele Grüße aus dem Unterallgäu
Harry

1 „Gefällt mir“

Es gab hier irgendwann mal ein Thread zur Verbrauchsdatenauswertung, finde ihn aber gerade nicht mehr.
Habe dir mal das auf den Wasserzähler abgeänderte Script angehängt, das ursprünglich für den Stromverbrauch war.
Vielleicht hilft dir das weiter.
VG,
Doc

#########################################################################################################################################################################
# Version: 1.2
# Author: Heiko Wilknitz
# Anpassung by Zerfasm & Drapple  
# Nochamls vielen Dank an Pitti der den Ursprung für dieses Skript gelegt hat!

// ----------------------------- KONFIGURATION --------------------------------------------------------------------------------------------------------------------------

// Anzahl Nachkommastellen bei Ergebnissen
$roundTo2   = 2; //Anzahl Nachkommastellen bei Ergebnissen
$roundTo3   = 4; //Anzahl Nachkommastellen bei Ergebnissen
//$kosten        = GetValue(28299); //Floatvariable mit dem Preis pro kWh (Vergütung)

//Logging einstellen
$logDay        = false; //Logging für Tag einstellen
$logWeek    = false; //Logging für Woche einstellen
$logMonth    = false; //Logging für Monat einstellen
$logYear    = false; //Logging für Jahr einstellen
$logVisual    = false; //Anzeige der Variable in der Visualisierung im Webfront deaktiveren oder aktivieren

//Auswahl ob Instanzen mit den Variablen unter einer Kategorie oder einer weiteren Instanz angeordnet werden sollen
$category = true;

//Wenn das Skript die max. Zeit von 30 Sekunden beim ersten ausführen überschreitet, kann mit der nächsten Zeile die Fehlermeldung verhindert werden
set_time_limit (60); //Hier kann die Zeit in Sekunden angegeben werden

// ----------------------------------- ID´s -----------------------------------------------------------------------------------------------------------------------------
$parentID     = IPS_GetObject($_IPS['SELF']); 
$parentID     = $parentID['ParentID'];

//ID des ArchiveHandler ermitteln 
$instances     = IPS_GetInstanceListByModuleID('{43192F0B-135B-4CE7-A0A7-1475603F3060}'); 
$archiveID     = $instances[0]; 

// Zähler
//$valueID     = IPS_GetObjectIDByIdent("ENERGY_COUNTER_TOTAL", $parentID); //Wenn ObjektID verwendet werden soll
$valueID     = 42321;   //Wenn VariablenID verwendet werden soll


// -------------------------- VARIABLENPROFIL ERSTELLEN -----------------------------------------------------------------------------------------------------------------
// Profilname kWh    
$vpname="Wasserzaehler";
if (!IPS_VariableProfileExists($vpname)) //Wenn das Provil noch nicht Exestiert dann lege es an:
{
    IPS_CreateVariableProfile($vpname, 2); //Variabelprofil erstellen
    IPS_SetVariableProfileIcon($vpname,"Lightning"); //Variabelprofil Icon zuweisen
    IPS_SetVariableProfileText($vpname,""," m³"); //Suffix setzen
    IPS_SetVariableProfileValues($vpname, 0, 0,0 ); //Der Befehl setzt den MinimalWert, MaximalWert und die Schrittweite eines Variablenprofils mit Namen ProfilName.
    IPS_SetVariableProfileDigits($vpname, $roundTo3); //Anzahl Nachkommastellen, in diesem Fall 3
}


// -------------------------- AUSWAHL OB KATEGORIEN ODER INSTANZEN ERSTELLEN --------------------------------------------------------------------------------------------

If ($category == true)
{
    $enerID = GetorCreatecategory("Wasserzählerberichte",$parentID);
//    $enerCostID = GetorCreatecategory("Energieeinspeisungsvergütung",$parentID);
}
else
{
    $enerID = GetorCreateInstanz("Wasserzählerberichte","dummy",$parentID);
//    $enerCostID = GetorCreateInstanz("Energieeinspeisungsvergütung","dummy",$parentID);
}

// -------------------------- INSTANZEN ERSTELLEN -----------------------------------------------------------------------------------------------------------------------
// Verbrauchsinstanzen anlegen
$lastID = GetOrCreateInstanz("Verbrauch Zuletzt","dummy",$enerID);
$currID = GetOrCreateInstanz("Verbrauch Aktuell","dummy",$enerID); 
$consID = GetOrCreateInstanz("Hochrechnung Verbrauch","dummy",$enerID); 


// -------------------------- VARIABLEN ERSTELLEN -----------------------------------------------------------------------------------------------------------------------

// Verbrauchsvariablen anlegen bzw. auslesen
$lastDayID     = GetOrCreateVariable('Letzter Tag',2,"POWER_CONSUMPTION_LAST_DAY",$vpname,"",$logDay,$lastID,"1",$logVisual); 
$lastWeekID = GetOrCreateVariable('Letzte Woche',2,"POWER_CONSUMPTION_LAST_WEEK",$vpname,"",$logWeek,$lastID,"2",$logVisual); 
$lastMonthID = GetOrCreateVariable('Letzter Monat',2,"POWER_CONSUMPTION_LAST_MONTH",$vpname,"",$logMonth,$lastID,"3",$logVisual); 
$lastYearID = GetOrCreateVariable('Letztes Jahr',2,"POWER_CONSUMPTION_LAST_YEAR",$vpname,"",$logYear,$lastID,"4",$logVisual); 

$currDayID     = GetOrCreateVariable('Aktueller Tag',2,"POWER_CONSUMPTION_ACTUAL_DAY",$vpname,"",$logDay,$currID,"1",$logVisual);
$currWeekID = GetOrCreateVariable('Aktuelle Woche',2,"POWER_CONSUMPTION_ACTUAL_WEEK",$vpname,"",$logWeek,$currID,"2",$logVisual);
$currMonthID = GetOrCreateVariable('Aktueller Monat',2,"POWER_CONSUMPTION_ACTUAL_MONTH",$vpname,"",$logMonth,$currID,"3",$logVisual);
$currYearID = GetOrCreateVariable('Aktuelles Jahr',2,"POWER_CONSUMPTION_ACTUAL_YEAR",$vpname,"",$logYear,$currID,"4",$logVisual);

$consDayID     = GetOrCreateVariable('Tag',2,"POWER_CONSUMPTION_EXTRAPOLATION_DAY",$vpname,"",$logDay,$consID,"1",$logVisual);
$consWeekID = GetOrCreateVariable('Woche',2,"POWER_CONSUMPTION_EXTRAPOLATION_WEEK",$vpname,"",$logWeek,$consID,"2",$logVisual);
$consMonthID = GetOrCreateVariable('Monat',2,"POWER_CONSUMPTION_EXTRAPOLATION_MONTH",$vpname,"",$logMonth,$consID,"3",$logVisual);
$consYearID = GetOrCreateVariable('Jahr',2,"POWER_CONSUMPTION_EXTRAPOLATION_YEAR",$vpname,"",$logYear,$consID,"4",$logVisual);


// -------------------------- LETZTE WERTE ------------------------------------------------------------------------------------------------------------------------------
// GESTERN
$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Täglich */, strtotime("yesterday"), strtotime("today")-1, 0); 
SetValueFloat($lastDayID, CalcConsumption($data));
//SetValue($lastDayCostID,GetValue($lastDayID)*$kosten);

// LEZTE WOCHE
$data = AC_GetAggregatedValues($archiveID, $valueID, 2 /* Wöchentlich */, strtotime("monday last week"), strtotime("monday this week")-1, 0); 
SetValueFloat($lastWeekID, CalcConsumption($data));
//SetValue($lastWeekCostID,GetValue($lastWeekID)*$kosten);

// LETZTER MONAT
$data = AC_GetAggregatedValues($archiveID, $valueID, 3 /* Monatlich */, strtotime("first day of last month 00:00:00"), strtotime("last day of last month 23:59:59"), 0); 
SetValueFloat($lastMonthID, CalcConsumption($data));
//SetValue($lastMonthCostID,GetValue($lastMonthID)*$kosten);

// LETZTES JAHR
$ly = date('Y', strtotime('-1 year'));
$data = AC_GetAggregatedValues($archiveID, $valueID, 4 /* Jährlich */, mktime(0, 0, 0, 1, 1, $ly), mktime(23, 59, 59, 12, 31, $ly), 0); 
SetValueFloat($lastYearID, CalcConsumption($data));
//SetValue($lastYearCostID,GetValue($lastYearID)*$kosten);


// ------------------------- AKTUELLE WERTE -----------------------------------------------------------------------------------------------------------------------------
// HEUTE
$data = AC_GetAggregatedValues($archiveID, $valueID, 1 /* Stündlich */, strtotime("today"), strtotime("now"), 0);
$dataDay = CalcConsumption($data);
SetValueFloat($currDayID, $dataDay);
//SetValue($currDayCostID,GetValue($currDayID)*$kosten);

// WOCHE
$data = AC_GetAggregatedValues($archiveID, $valueID, 2 /* Wöchentlich */, strtotime('last monday', strtotime('tomorrow')), strtotime("now"), 0); 
$dataWeek = CalcConsumption($data);
SetValueFloat($currWeekID, $dataWeek);
//SetValue($currWeekCostID,GetValue($currWeekID)*$kosten);

// MONAT
$data = AC_GetAggregatedValues($archiveID, $valueID, 3 /* Monatlich */, strtotime("first day of this month 00:00"), strtotime("now"), 0);
$dataMonth = CalcConsumption($data);
SetValueFloat($currMonthID, $dataMonth);
//SetValue($currMonthCostID,GetValue($currMonthID)*$kosten);

// JAHR
$data = AC_GetAggregatedValues($archiveID, $valueID, 4 /* Jährlich */, strtotime("first day of January"), strtotime("now"), 0); 
$dataYear = CalcConsumption($data);
SetValueFloat($currYearID, $dataYear);
//SetValue($currYearCostID,GetValue($currYearID)*$kosten);


// ------------------------- HOCHRECHNUNG -------------------------------------------------------------------------------------------------------------------------------
// TAG
$diff = strtotime('now') - strtotime('today');
$full = 60*60*24; // 24h
$data = round($dataDay*$full/$diff, $roundTo3);
SetValueFloat($consDayID, $data);
//SetValue($consDayCostID,GetValue($consDayID)*$kosten);

// WOCHE
$diff = strtotime('now') - strtotime('last monday', strtotime('tomorrow'));
$full = 60*60*24*7; // 7 Tage
$data = round($dataWeek*$full/$diff, $roundTo3);
SetValueFloat($consWeekID, $data);
//SetValue($consWeekCostID,GetValue($consWeekID)*$kosten);

// MONAT
$diff = strtotime('now') - strtotime('first day of this month 00:00');
$full = 60*60*24*date('t'); // 1 Monat
$data = round($dataMonth*$full/$diff, $roundTo3);
SetValueFloat($consMonthID, $data);
//SetValue($consMonthCostID,GetValue($consMonthID)*$kosten);

// JAHR
$diff = strtotime('now') - strtotime('first day of January');
$full = 60*60*24*365; // 1 Jahr
$data = round($dataYear*$full/$diff, $roundTo3);
SetValueFloat($consYearID, $data);
//SetValue($consYearCostID,GetValue($consYearID)*$kosten);


// ------------------------- TIMER ERSTELLEN ----------------------------------------------------------------------------------------------------------------------------
SetTimerByName($_IPS['SELF'], "Täglich alle Stunde");


// ------------------------- FUNKTIONEN ---------------------------------------------------------------------------------------------------------------------------------
// Funktion zum addieren der Zählerwerte 
function CalcConsumption($values) 
{
    global $roundTo3;
    $consumption = 0;
    foreach($values as $value) 
    {
            $consumption += $value['Avg'];
    }
    return round($consumption, $roundTo3);
} 
    
// Funktion um einen Timer zu erzeugen
function SetTimerByName($parentID, $name) 
{
    Global ${$_IPS['SELF']};
    $eid = @IPS_GetEventIDByName($name, $parentID);
    if($eid === false) 
{
    $eid = IPS_CreateEvent(1);
    IPS_SetParent($eid, $parentID);
    IPS_SetName($eid, $name);
    
    IPS_SetEventCyclic($eid, 2 /* Täglich */, 1 /* Jeden Tag */, 0, 0, 3 /* Stündlich */, 1 /* Alle Stunden */);
    IPS_SetEventCyclicTimeFrom($eid, 0, 1, 0); //Ab 00:01 stündlich starten
    IPS_SetEventActive($eid, true);
}
    return $eid;
} 


// ------------------------- IPS GRUNFUNKTIONEN -------------------------------------------------------------------------------------------------------------------------
// Erstellt eine Variable, wenn diese noch nicht existiert
function GetOrCreateVariable($name, $vtyp, $ident, $profil, $ascript, $log, $parentID, $position, $logVisual) // erstellt eine Variable, wenn es noch nicht exestiert
/* 
Wert 1 = Name
Wert 2 = Variablentyp
Wert 3 = Variablen-Ident 
Wert 4 = Variablenprofil 
Wert 5 = ScriptID 
Wert 6 = Logging der Daten (True/False)
Wert 7 = Übergeordnete Instanz, wo die Variable angelegt werden soll 
Wert 8 = Reihenfolge / Sortierung der Variablen
Wert 9 = Anzeige der Variable in der Visualisierung im Webfront deaktiveren oder aktivieren
*/
{
    $ObjId = @IPS_GetObjectIDByName($name, $parentID);
    if ($ObjId === false)
    {
        $ObjId = IPS_CreateVariable($vtyp);
        IPS_SetName($ObjId, $name); //Namen vergeben
        IPS_SetIdent($ObjId, $ident); //ObjectIdent vergeben
        IPS_SetParent($ObjId, $parentID); //Variable unter die Instantz verschieben
        @IPS_SetVariableCustomProfile($ObjId, $profil); //Variablen-Profil zuordnen
        @IPS_SetVariableCustomAction($ObjId, $ascript); //Verknüpft das Script mit der Variable als Actionscript

        // Archive Control ID herrausfinden
        foreach(IPS_GetInstanceList ( ) as $m_id) //Durchsucht alle Instanzen und gibt die InstanzID an $i_id weiter
        {
            $typ = IPS_GetInstance($m_id)['ModuleInfo']['ModuleName']; //Fragt die Instanzen nach den Modulnamen ab
            if ($typ =="Archive Control") $modul_id = $m_id; //Wenn die Instanz den Modulnamen "Archive Control" hat, dann schreibe die ID in $modul_id
        }
        
        $logging = AC_GetLoggingStatus($modul_id,$ObjId);
        if ($logging != 1)
        {
            AC_SetLoggingStatus($modul_id, $ObjId, $log);
            AC_SetGraphStatus($modul_id, $ObjId, $logVisual);
            IPS_ApplyChanges($modul_id);
        }// Ende Logging
        
        IPS_SetPosition($ObjId, $position);
    }
    return $ObjId;
}

// Erstellt eine Instanz, wenn diese noch nicht existiert
function GetOrCreateInstanz($name, $ityp, $parentID) //erstellt eine Variable, wenn diese noch nicht exestiert
/*
Wert 1 = Name
Wert 2 = Instanztyp 
Wert 3 = Übergeordnete Instanz, wo die Instanz angelegt werden soll
*/
{
    $ObjId = @IPS_GetObjectIDByName($name, $parentID);
    if ($ObjId === false)
    {
        if ($ityp == "dummy") $ityp='{485D0419-BE97-4548-AA9C-C083EB82E61E}';
        $ObjId = IPS_CreateInstance($ityp);
        IPS_SetName($ObjId, $name); // Namen vergeben
        IPS_SetParent($ObjId, $parentID); // Variable unter die Instantz verschieben
    }
    return $ObjId;
}

// Erstellt ein Script, wenn es noch nicht exestiert
function GetOrCreateScript($name, $parentID, $data, $hidden) 
/*
Wert 1 = Name
Wert 2 = Übergeordnete Instanz, wo das Script angelegt werden soll
Wert 3 = Ist das, was ins Script geschrieben wird
Wert 4 = Ob das Script sichtbar sein soll (true, false)
*/
{
    $ObjId = @IPS_GetObjectIDByName($name, $parentID);
    if ($ObjId === false)
    {
         $ObjId = IPS_CreateScript(0);
        IPS_SetName($ObjId, $name);
        IPS_SetScriptContent($ObjId, "$data"); // Der Text was ins Script geschrieben wird
        IPS_SetHidden($ObjId, $hidden); // Setzt Script auf nicht sichtbar
        IPS_SetParent($ObjId, $parentID); //  Script unter das Parent verschieben
     }
    return $ObjId;
}

// Erstellt eine Kategorie, wenn diese noch nicht exestiert
function GetorCreatecategory($name, $parentID)
#function GetorCreatcategory($name,$parent, $position, $hidden)
{
$LinkID = @IPS_GetObjectIDByName($name, $parentID);
if ($LinkID === false)
{
    $LinkID = IPS_CreateCategory(); // Link anlegen
    IPS_SetName($LinkID, $name); // Link benennen
    IPS_SetParent($LinkID, $parentID); // Link einsortieren unter dem Objekt mit der ID "12345 /*[Webfront\Tablet\EG\Energieberichte\Übersicht\Kosten\Hochrechnung\Hochrechnung Kosten pro Jahr\Waschmaschine]*/"
    #if ($hidden ===true) IPS_SetHidden($LinkID,true);
    #IPS_SetPosition($LinkID,$position); //Position festlegen
}
    return $LinkID;
}

Hallo,

hat schon jemand das Update 7.1.1 drauf.
Ich finde das die sehr instabil ist, der ESP scheint sehr oft neu zu starten. Ich habe drei ESP Cams angewandt und alle weisen das selbe Problem auf.

Ich habe meine ESP vollständif neu geflashed, vollkommen gelöscht, neu geflashed und die SD Karte auch neu die Daten rum kopiert.

Hat jemand auch das Problem das die ESP mit der Version 7.1.1 instabil sind ?

Gruß

Bei meinem Wasserzähler habe ich 7.1.0 - da läuft alles prima.

Momentan versuche ich auch den Gaszähler auszustatten, hier zickt der ESP auch rum.
Es ist dort die 7.1.1 :frowning:

Leider habe ich die Binaries von 7.1.0 nicht mehr und finde sie auch auf Github nicht.

Kannst Du mir ein ZIP-File mit 7.1.0 zur Verfügung stellen (oder einen Tipp für den Download geben), dann teste ich mit der Version ob die Probleme verschwinden.

Viele Grüße aus dem Unterallgäu
Harry

PS
Ich habe die 7.1.0 doch noch auf Github gefunden - werde testen.

So gut wie eigentlich der Gedanke ist,
Oft stürzen leider die ESP zu oft ab.

Also die 7.1.1. Hat bei mir überhaupt nicht funktioniert.

Es scheint tatsächlich an der Firmware zu liegen.
Ich habe jetzt auch am Gaszähler die 7.1.0 installiert und es scheint stabil zu sein.

Vielen Dank für den Hinweis, da wäre ich so schnell nicht draufgekommen. Danke mactoolz.

Viele Grüße aus dem verregneten Unterallgäu
Harry

@Doctor_Snuggles vielen danke, ich schaue mir das morgen mal an und hoffe das ich es mit meinem Halbwissen hinbekomme :slight_smile:

@harry28 was genau hattest du für Probleme mit der 7.1.1 ? Habe die auch aktuell drauf. Kann man die über OTA einfach wieder auf 7.1 bringen

Es war genau so wie von mactoolz beschrieben:
Der ESP hat oft rebootet und es war kein stabiler Zugriff über die Weboberfläche möglich.

Jetzt mit 7.1.0 ist alles stabil und der Zugriff zuverlässig möglich. Auch die Anbindung an IPS über MQTT passt.

Ich habe heute komplett neu geflasht und die SD-Karte neu bespielt - nicht über OTA, sondern direkt über den USB-Programmer. Das Update von 6.4.1 auf 7.1.0 bzw. von 7.1.0 auf 7.1.1 hatte ich per OTA gemacht.

Viele Grüße aus dem Unterallgäu
Harry

1 „Gefällt mir“

Hallo Zusammen,

ich habe nun fertig: Wasseruhr und Gaszähler sind in IPS eingebunden.
Fotos gibt es hier:
Wasseruhr / Gaszähler
Vielen Dank für die Tipps in diesem Thread.

Viele Grüße aus dem Unterallgäu
Harry

2 „Gefällt mir“

Gut, dass ich gewartet habe. Nun lag eine Wechselanzeige im Briefkasten

Wo du gerade dieses Thema ansprichst …

Wie handhabt ihr das eigentlich bei einem Zählertausch mit den geloggten Daten.
Gerade der Wasserzähler wird ja recht häufig turnusmäßig getauscht und hier in diesem Fall ensprechen die geloggten Daten ja dem wirklichem Zählerstand des aktuellen Zählers.
Wie bindet man dann denn den neuen Zähler ein der verm. ja wieder mit „0“ anfängt?

Viele Grüße,
Doc

Ich wohne jetzt seit 20 Jahren hier und der Zähler ist in Summe 1-2 mal getauscht worden. Das ist eher mal nicht häufig. Und ich logge den Verbrauch pro Tag. Die Gesamtsumme interessiert mich eigentlich nur einmal im Jahr.

Na dann schau mal ins Mess- und Eichgesetz. Das wurde sogar verschärft, wie ich las und die Fristen sind tagesgenau anzuwenden.
Kaltwasserzähler geeicht für 6 Jahre
Bußgeld bis zu 50k€

Alle 5 Jahre für den Wasserzähler wurde mir mal von den Stadtwerken gesagt.
Passt ja, wenn sie mit den 6 Jahren auf der sicheren Seite bleiben wollen.

Bleibt nur noch die Frage, wie gerade hier bei den geloggten Zählerwerten mit der Cam, die ja genau dem Wasserzähler entsprechen, wie man damit bei einem Zählertausch umgehen kann, damit das dann auch weiter sauber geloggt wird.
Wie macht ihr das dann, mit einer Hilfsvariablen weiter zählen?

Viele Grüße,
Doc

Mach doch die Zählervariable zur Hilfsvariablen, die dann nur noch den IPS Zählerwert triggert.

Ja so meinte ich das auch.
Dachte da gäbe es einen anderen, besseren Weg oder schon ggf. ein Modul für.