Gaszähler auslesen

  • Genial
    Da freue ich mich schon drauf. Wenn ich das aufgebaut und in OH3 integriert habe, dann beschreibe ich das mal.

    Schick mir bitte Deine Bankdaten und sag mir was Du für Deine Aufwände haben möchtest damit ich das gleich überweisen kann.
    Es war ja jetzt doch mehr zu tun und Du musstest in Fusion360 noch Hand anlegen

    VG Uwe

  • heute was schon der Postbote da
    Und beim zusammenbauen fiel mir auch schon ein was ich noch besorgen wollte!

    ihr könnt es euch schon denken, das Spiegelglas

    ich werde nachher die Bilder des Zusammenbaus bearbeiten und posten

    noch einmal ein herzliches Dankeschön an @don

  • Die Teile passten genau ineinander

    fangen mal an und stellen die Teile von

    zuerst setzen wir den ESP32 ein. Man beachte die Aussparung für die SD Karte

    darauf kommt die Halterung

    nun noch das Modul für die Stromversorgung abdecken

    Man sieht, woher ich es bezogen habe.

    und Deckel drauf

    ab in den Keller zum Gaszähler

    ich hatte leider bei der ganzen Messerei übersehen das auf der linken Seite eine Lasche rausschaute. Aber wofür hat man einen Dremel

    das ESP Gehäuse drauf und theoretisch könnte man das jetzt einrichten, wenn da nicht die Sache mit dem Spiegel wäre

    Will be Continued ….

  • So, nicht das gedacht wird das es nicht weiter geht.
    Spiegel habe ich (Rossmann 99 Cent)
    Aber ich musste den Ausschnitt etwas versetzen, da ich sonst die erste Zahl auf dem Zähler nicht auf dem Bild bekommen hätte.
    Aber, egal wie ich die LED einstelle oder den Blickwinkel der Kamera anpasse, die LED reflektiert so stark das damit 2 Zahlen nich gelesen werden können.
    Ich werde auf den Anschluss einer externen LED gehen. Die LED und den erwähnten Kondensator muss ich mir leider besorgen. Habe ich so nicht in meinem Nähkästchen liegen.

    Danach geht es weiter

    Hier das Bild mit der Reflextion, die beiden Zahlen vor dem Komma bekommt das System nicht aufgelöst

  • Ich benötige einmal die Hilfe eines Elektronikers

    Im Text der Anleitung für eine externe LED wird von einem 470 Ohm resistor gesprochen.
    Nur, wenn ich danach suche bekomme ich eine Flut an verschiedenen Widerständen auch was die Spannung angeht.

    Kann mir bitte jemand hier weiterhelfen und den korrekten Widerstand mir sagen?

    https://github.com/jomjol/AI-on-the-edge-device/wiki/External-LED

    Ich danke schon einmal vorab

    VG Uwe

  • So richtig notwendig ist keines der zusätzlichen Bauteile, da du nur eine LED verwendest.
    Sollte es zu Problemen kommen, weil irgendeine Spannung einbricht, dann kann man noch immer handeln.
    Aber an sich sehe ich keine Notwendigkeit dafür.
    Hast du denn eine 5V RGB zu Hause?
    Bei einer normalen LED wären 5V zu viel.

  • Du kannst natürlich auch jede andere LED nehmen.
    Die RGBs können halt leicht gedimmt werden und ein anderer Farbwert eingestellt werden.
    Aber eine LED kannst du in jedem Fall auch dimmen.
    Entweder im Code oder bis zu einem gewissen Punkt durch weniger Strom (höherer Widerstand).

    Wobei du auch "manuell" die LED auf dem Modul dimme kannst. Etwas drüberkleben zb.
    Die ist ja sehr grell. Ein Stück Stoff zum abschwächen geht auch als Diffusor.

  • Da ich noch auf die LEDs zum besseren ausleuchten warte, habe ich schon einmal mit der Einrichtung angefangen.

    Die Daten müssen ja in Openhab, ich selbst nutze die aktuelle Version OH3

    In der Config des ESP32 habe ich für MQTT folgendes eingetragen
    Main Topic: Gaszaehler
    ClientID: gasometer

    Damit die Werte vor und nach dem Komma separat übermittelt werden, habe ich die Stellen nach dem Komma (5 Digits) in der Config eingetragen und für die Nachkommastellen 2 Digits als Sub definiert

    Openhab:
    Als MQTT Broker kommt Mosquito zum Einsatz.
    Die Channel werden dann wie folgt eingestellt
    Name wie bei jedem Channel frei wählbar
    unter MQTT State topic muss dann folgendes eingetragen werden
    Gaszaehler/main/timestamp
    Gaszaehler/main/value
    Gaszaehler/main/raw
    Gaszaehler/main/error

    Für die Nachkommastellen
    Gaszaehler/sub/timestamp
    Gaszaehler/sub/value
    Gaszaehler/sub/raw
    Gaszaehler/sub/error

    Zwischenzeitlich habe ich dank des neu erworbenen Anycubic i3 Mega S Druckers ein kleines Kästchen gedruckt mit dem ich den Abstand der Linse vom Spiegel vergrößert habe.

    Der Abstand wurde um 25mm vergrößert

    Ich werde das noch verfeinern, sobald ich die richtige Ausleuchtung (nach Lieferung der LEDs) gefunden habe.

    Aktuell werden die Zahlen noch nicht richtig erkannt durch die ungleichmäßige Ausleuchtung

  • Ich habe auf die externen LED verzichtet und stattdessen den Abschnitt unter der LED verdunkelt.

    Das Bild ist jetzt auch gut sichtbar und ich werde mit Werten beliefert.

    Kommen wir zur Konfiguration, wie ich die Daten verarbeite

    Openhab:
    Als MQTT Broker kommt Mosquito zum Einsatz.
    Die Channel werden dann wie folgt eingestellt
    Name wie bei jedem Channel frei wählbar
    unter MQTT State topic muss dann folgendes eingetragen werden
    gaszaehler/main/timestamp
    gaszaehler/main/value
    gaszaehler/main/raw
    gaszaehler/main/error
    gaszaehler/main/changeabsolut


    Für die Nachkommastellen
    gaszaehler/sub/timestamp
    gaszaehler/sub/value
    gaszaehler/sub/raw
    gaszaehler/sub/error
    gaszaehler/sub/changeabsolut

    Da ich mir den Verbrauch bei Strom und eben jetzt bei Gas immer monatlich ausrechne habe ich folgende Items angelegt
    Zuerst die Item für den Preis, hier wurden folgende angelegt. Ich erwähne die Itemnamen deshalb, weil sonst die nachfolgende Rule nicht klar ist.

    Gasbezugskosten // Hier packt ihre den Nettopreis für die kWh Gas rein.
    GasGrundgebuehrTag // Hier packt ihr die Grundgebühr rein, bitte den Jahrespreis / 365

    Gas_Zaehlerfaktor // Der ist aus der letzten Rechnung ersichtlich

    Gas_Brennwert // Ebenfalls aus der letzten Rechnung ersichtlich

    Gasstand_letzteLesung // Der Zählerstand bei der letzten Abrechnung

    Gastariftage // Hier schreibt die Regel die Anzahl Tage seit der letzten Abrechnung rein


    Kommen wir zu den Items zur Erfassung der Verbrauchswerte, sofern nicht anders angegeben sind das alles Number Item

    Spoiler anzeigen


    GasVerbrauchJahr
    GasKostenJahr
    GasKostenJahrForecast
    GasVerbrauchJahrForecast
    GasDayAverageMeter
    GasDayAverage
    GasDayAverageCost

    Für die einzelnen Monate:
    Gas_Stand_Januar
    Gas_VerbrauchJanuar
    Gas_kostenJanuar
    Gas_TagesverbrauchJanuar


    //für die restlichen Monate entsprechend fortsetzen

    Dazu folgende Regel

    Spoiler anzeigen

    rule "aktueller GasStand"
    when
    Time cron "0 0/5 * 1/1 * ? *"
    then
    //Variablen definieren und Werte setzen
    var regel_startzeit = now()
    val Number MonatsVal = regel_startzeit.getMonthValue()
    val Number Tageszahl = now.getDayOfMonth()
    var startday = LocalDate.parse("2021-10-06").atStartOfDay() // Gasstand_letzteLesung.state
    var long dif_days = Duration.between(startday, now).toDays()
    var day = LocalDate.parse("2021-10-06").atStartOfDay()

    //Uebername aus dem esp32
    if (Gasometer_GasometerMainChangeAbsolut.state >= 0) {
    Gasstand_Aktuell.sendCommand((Gasometer_GasometerValue.state as Number) + (GasometerNachkomma.state as Number) / 1000)
    }

    //Allgemeine Daten schreiben
    Gastariftage.sendCommand(Duration.between(day, now).toDays()) //Duration.between(day,ZonedDateTime.now()).toDays()
    GasVerbrauchJahr.sendCommand(((Gasstand_Aktuell.state as Number) - Gasstand_letzteLesung.state) * Gas_Zaehlerfaktor.state as Number * Gas_Brennwert.state as Number ) //Verbrauch ab Zählerstand 6.10.2021
    GasKostenJahr.sendCommand(((GasVerbrauchJahr.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Gastariftage.state as Number) * (GasGrundgebuehrTag.state as Number)))
    GasKostenJahrForecast.sendCommand((GasKostenJahr.state as Number) / (Gastariftage.state as Number) * 365)
    GasVerbrauchJahrForecast.sendCommand((GasVerbrauchJahr.state as Number) / (Gastariftage.state as Number) * 365)
    GasDayAverageMeter.sendCommand(((Gasstand_Aktuell.state as Number) - (Gasstand_letzteLesung.state)) / (dif_days))
    GasDayAverage.sendCommand((GasVerbrauchJahr.state as Number) / (dif_days))
    GasDayAverageCost.sendCommand((GasKostenJahr.state as Number) / (dif_days))

    //Monatswerte berechnen und setzen
    switch (MonatsVal) {
    case 1 : {
    Gas_Stand_Januar.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchJanuar.sendCommand(((Gas_Stand_Januar.state as Number) - (Gas_Stand_Dezember.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenJanuar.sendCommand(((Gas_VerbrauchJanuar.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchJanuar.sendCommand((Gas_VerbrauchJanuar.state as Number) / Tageszahl)
    }

    case 2 : {
    Gas_Stand_Februar.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchFebruar.sendCommand(((Gas_Stand_Februar.state as Number) - (Gas_Stand_Januar.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenFebruar.sendCommand(((Gas_VerbrauchFebruar.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchFebruar.sendCommand((Gas_VerbrauchFebruar.state as Number) / Tageszahl)
    }


    case 3 : {
    Gas_Stand_Maerz.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchMaerz.sendCommand(((Gas_Stand_Maerz.state as Number) - (Gas_Stand_Februar.state as Number))* (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenMaerz.sendCommand(((Gas_VerbrauchMaerz.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchMaerz.sendCommand((Gas_VerbrauchMaerz.state as Number) / Tageszahl)
    }


    case 4 : {
    Gas_Stand_April.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchArpil.sendCommand(((Gas_Stand_April.state as Number) - (Gas_Stand_Maerz.state as Number))* (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenApril.sendCommand(((Gas_VerbrauchApril.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchApril.sendCommand((Gas_VerbrauchApril.state as Number) / Tageszahl)
    }


    case 5 : {
    Gas_Stand_Mai.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchMai.sendCommand(((Gas_Stand_Mai.state as Number) - (Gas_Stand_April.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenMai.sendCommand(((Gas_VerbrauchMai.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchMai.sendCommand((Gas_VerbrauchMai.state as Number) / Tageszahl)
    }


    case 6 : {
    Gas_Stand_Juni.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchJuni.sendCommand(((Gas_Stand_Juni.state as Number) - (Gas_Stand_Mai.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenJuni.sendCommand(((Gas_VerbrauchJuni.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchJuni.sendCommand((Gas_VerbrauchJuni.state as Number) / Tageszahl)
    }


    case 7 : {
    //logInfo("GASstand", MonatsVal.toString())
    Gas_Stand_Juli.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchJuli.sendCommand(((Gas_Stand_Juli.state as Number) - (Gas_Stand_Juni.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenJuli.sendCommand(((Gas_VerbrauchJuli.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchJuli.sendCommand((Gas_VerbrauchJuli.state as Number) / Tageszahl)
    }


    case 8 : {
    Gas_Stand_August.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchAugust.sendCommand(((Gas_Stand_August.state as Number) - (Gas_Stand_Juli.state as Number))* (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenAugust.sendCommand(((Gas_VerbrauchAugust.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchAugust.sendCommand((Gas_VerbrauchAugust.state as Number) / Tageszahl)
    }


    case 9 : {
    Gas_Stand_September.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchSeptember.sendCommand(((Gas_Stand_September.state as Number) - (Gas_Stand_August.state as Number))* (Gas_Zaehlerfaktor.state as Number) *(Gas_Brennwert.state as Number))
    Gas_kostenSeptember.sendCommand(((Gas_VerbrauchSeptember.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchAugust.sendCommand((Gas_VerbrauchAugust.state as Number) / Tageszahl)
    }


    case 10 : {
    Gas_Stand_Oktober.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchOktober.sendCommand(((Gas_Stand_Oktober.state as Number) - (Gas_Stand_September.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenOktober.sendCommand(((Gas_VerbrauchOktober.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchOktober.sendCommand((Gas_VerbrauchOktober.state as Number) / Tageszahl)
    }


    case 11 : {
    Gas_Stand_November.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchNovember.sendCommand(((Gas_Stand_November.state as Number) - (Gas_Stand_Oktober.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenNovember.sendCommand(((Gas_VerbrauchFebruar.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchNovember.sendCommand((Gas_VerbrauchNovember.state as Number) / Tageszahl)
    }


    case 12 : {
    Gas_Stand_Dezember.sendCommand((Gasstand_Aktuell.state as Number))
    Gas_VerbrauchDezember.sendCommand(((Gas_Stand_Dezember.state as Number) - (Gas_Stand_November.state as Number)) * (Gas_Zaehlerfaktor.state as Number) * (Gas_Brennwert.state as Number))
    Gas_kostenDezember.sendCommand(((Gas_VerbrauchDezember.state as Number) * (Gasbezugskosten.state as Number) * 1.19) + ((Tageszahl) * (GasGrundgebuehrTag.state as Number)))
    Gas_TagesverbrauchDezember.sendCommand((Gas_VerbrauchDezember.state as Number) / Tageszahl)
    }
    }
    end

    Für die Anzeige habe ich dann normale Label genutzt

    Beispiel Yaml

    Spoiler anzeigen


    component: oh-label-card
    config:
    fontSize: 1.3em
    footer: '="Vorschau Jahr: " + items.GasKostenJahrForecast.displayState'
    item: GasKostenJahr
    title: Jahreswerte (ab 06.10.21)

  • Aber gerne doch

    Wie man sieht, habe ich den Bereich vor dem Komma als Main gelassen und für die Nachkommastellen "Sub" definiert
    Damit werden dann zwei getrennte Werte übermittelt.

    Nachtrag:
    Das Gehäuse werde ich noch einmal neu konstruieren, da ich doch mit dem Dremel die ein oder andere Anpassung vorgenommen habe und oben die 25mm Abstand dazu gepackt habe.
    Aber da muss ich mich erst in Freecad o.ä. reinfuchsen
    Jetzt bleibt das erst einmal so. Bin froh das alles passt

    Und dann noch die Bilder des von mir arg malträtierten 3D-Drucks von Don (möge er mir verzeihen :) )
    Mit 25mm Aufsatz

    Linke Seite angepasst


    Rechte Seite angepasst

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!