Wasseruhr auslesen mit einem ESP32-CAM

Ich hab hier drei 3D Drucker stehen aber es noch nicht geschafft, mir mal etwas für ein geeignetes Gehäuse zu überlegen. :crazy_face:

@Attain
Danke für den Tipp.
Ich sehe wir haben die selbe coole Uhr.
Wir ticken doch alle gleich :wink:

@Boui
Nimmst Du auch Aufträge entgegen?
Ich hätte da was um Deine Drucker auszulasten. :stuck_out_tongue_winking_eye:

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

1 „Gefällt mir“

Harry, leider geht da aktuell nix. Meine ToDoListe läuft über und ich möchte mir nicht noch mehr Druck aufbauen.
Aktuell hab ich mehr offene Baustellen, als mir lieb ist.

Das kommt mir sehr bekannt vor, trotz Vorruhestand quilt auch meine Projekte-Liste über. Meine ToDo-Liste ist auch überlang, aber zumindest die Werkstatt ist schon mal aufgeräumt und betriebsbereit. :grimacing:

Viele Grüße
Harry

Ein schönes Gehäuse für die ESP32Cam. Musste ich einfach mal posten.

Hi Stephan,
ich hätte Interesse an den Fusion 360-Dateien für das Gehäuse des Gaszählers. Kannst du die hier verlinken?

Grüße
Henry

@Teas1512 Ein kleiner Ping.

Ping :slight_smile:

Sorry hat ein wenig gedauert. Habe es erst grade gelesen.
Du hast eine PN von mir.

Gruß Stephan

1 „Gefällt mir“

Hallo zusammen,

ich benötige mal eure Hilfe um den Wasserzähler in ips anzeigen zu lassen.

Ich bekomme es einfach nicht hin, ich habe schon mehrere Sachen über mqtt laufen zigbee und tasmota

Kenn mir da jemand Schritt für Schritt helfen ?

Ich schließe mich @basti09 an. Mit Tasmota bin ich jetzt recht firm, aber den ESP32 über die oben beschriebene Software kriege ich einfach nicht geflashed.

Hallo,

mir ging es ähnlich: Tasmota kein Problem, aber der ESP32 und diese Software laufen etwas anders.

Im zugehörigen Wiki ist aber alles genau beschrieben:

Ich nutze das in Kapitel 2 Installation verlinkte ESP-Flash-Tool von Espressif (Windows-Version 3.8.7). Die Firmware besteht aus drei Teilen und man muss im Tool die jeweilige Adresse angeben (s.u.). Wichtig ist auch den ESP32 beim Einstecken des USB-Programmers in den Flash-Modus zu bringen (ist in der Anschlussskizze der Taster mit dem gelben Kabel gegen Gnd).

bootloader.bin 0x1000
partitions.bin. 0x8000
firmware.bin 0x10000

War das Flashen erfolgreich, dann die SD-Card (8 GB) mit den Dateien von Github bestücken und die wlan.ini an das eigene WLAN anpassen. Der ESP32 funktioniert nur mit eingelegter SD-Card, blinkt zunächst mit seiner roten LED (s. Beschreibung im Wiki) und schaltet dann einmal die weiße Kamera-LED kurz ein. Fertig.

Ich habe das mehrmals durchgeführt und nun läuft es problemlos.

Viele Grüße aus dem Unterallgäu
Harry

Beim flashen habe ich null Probleme gehabt, so wie in der Anleitung stand habe ich es gemacht. Ich bekomme den Mist nicht in IP-Symcon

Da bist Du kurz vor dem Ziel, denn das ist dann nur ein Problem der MQTT-Eintellungen (in der Weboberfläche der AI-Kamera) und des Symcon-MQTT-Servers. Im Symcon-Debug-Fenster sieht man die Topics und kann die Instanzen entsprechend konfigurieren.

Bin gerade unterwegs und kann keine Screenshots senden.

Gruß
Harry

Hallo Harry28,

ja richtig, ich habe schon viel mit zigbee mqtt und Tasmota mqtt laufen und bei der Cam sollte es ja genauso gehen, ist aber leider nicht so und ich weiß nicht wieso !

LG
Basti

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;
}