FHEM Forum

FHEM - Hardware => Einplatinencomputer => Thema gestartet von: dabuze am 27 Juni 2018, 19:11:30

Titel: TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: dabuze am 27 Juni 2018, 19:11:30
Hallo liebe fhem Gemeinde,

ich habe hier im Laufe der Zeit schon viele helfende Themen gefunden - Danke an der Stelle an alle und Grüße von einem "neuen" in die Runde.

Ich melde mich aber nicht ohne Grund - nein die Verzweiflung treibt mich um.
Mein aktuelles Vorhaben besteht darin mittels der bekannten TCRT5000­-Platine den Ferraris Stromzähler "auszulesen". Problem besteht darin, dass ich keine Position finde um die rote Markierung als Impuls zu erfassen. Objekte werden aber grundsätzlich schon bemerkt...

Zum Aufbau:
NodeMCU mit EasyESP
3.3V - GND - D6

Jeweils direkt an den Anschlüssen der Platine dran - glaube da kann man ned soviel falsch machen!?
Mittels Potentiometer kann man die Sensibilität ja schön einstellen - allerdings finde ich bei mir keine Stellung bei der die rote Markierung gefunden wird. Oder es ist so Ars.. knapp das die aller kleinste Bewegung zu Impulsen führt oder auch "andere" Stellen auf der Scheibe triggern....
Ich hab auch schon versucht mit eine grünen LED den Kontrast der Scheibe zu erhöhen - bringt gar nix außer das ich besser zuschauen kann.

Nun meine Frage - worauf muss ich achten um halbwegs Störungsfrei Impulse zu bekommen?

Anbei ein Bild - ja, der Sensor hängt grad schräg dran - so habe ich bisher noch am ehesten ein "Flimmern" der Kontroll LED einstellen können - aber wie gesagt auch an stellen wo keine Markierung ist wird ein Impuls erzeugt.



Danke und Grüße
Christian

Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: JoWiemann am 27 Juni 2018, 19:56:07
Vielleicht hilft Dir das weiter: https://forum.fhem.de/index.php?topic=54408.0
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: dabuze am 27 Juni 2018, 21:29:47
Danke - das war ein hoffnungsvoller Versuch - leider ergab das bei mir keine Besserung : (

Ich hab nun auch die Analogwerte in der loop laufenlassen - der Zuckt nicht mal wenn das rote vorbeiläuft...
Kann es sein dass es Material gibt bei dem die Infrarot Schranke nicht gut funktioniert?
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Otto123 am 27 Juni 2018, 21:53:36
Ich denke einfach um 90° drehen  ::)

Bei mir läuft seit diesem Artikel diese temporäre Lösung stabil (https://heinz-otto.blogspot.com/2016/10/ferrariszahler-abtasten-ein-experiment.html). Einzig das Panzerband ist gegen Powerstrip getauscht.

Gruß Otto
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: alpha1974 am 27 Juni 2018, 22:47:41
Ich hatte dasselbe Problem. Gelöst habe ich es, indem ich den Sensor waagerecht so angebracht habe, dass er leicht schräg von unten die Ferraris-Scheibe anvisiert (siehe angehängtes Foto). Etwaige Reflexionen von der Glasscheibe fallen damit nicht unmittelbar auf den Sensor zurück. Das Ganze mit Klebeband fixiert, nicht schön, verrichtet aber zuverlässig seinen Dienst.

Für die exakte Ausrichtung hilft eine Digitalkamera (auch Handykamera), mit der man den Infrarot-Punkt exakt auf die Ferrarisscheibe ausrichten kann.


Gesendet von meinem Nexus 5X mit Tapatalk

Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: dabuze am 28 Juni 2018, 19:25:24
Danke! auch das war ein vielversprechender Versuch - ich bin gestern sogar noch mal aus  dem Bett gekrochen um das kurz zu testen - hat nix gebracht. Jetzt habe ich auch noch mal paar Stunden damit verbracht das Spielzeug in allen erdenklichen Positionen zu platzieren....
Ich bin mittlerweile kurz davor die doofe Scheibe rauszuschlagen um diese Fehlerquelle zu Eliminieren.
Mit der DigiCam sehe ich auch, dass die Scheibe schön angeleuchtet wird - die Ausrichtung sollte also scho passen.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: alpha1974 am 28 Juni 2018, 22:25:50
Zitat von: dabuze am 28 Juni 2018, 19:25:24
Ich bin mittlerweile kurz davor die doofe Scheibe rauszuschlagen um diese Fehlerquelle zu Eliminieren.
Bei einem selbst installierten Zähler in der privaten Unterverteilung ist das vielleicht eine Alternative (wobei man dann ja eigentlich auch den Zähler gegen einen mit Impulsgeber austauschen könnte).

Bei einem "offiziellen" Zähler des Versorgers hab ich mir schon dreimal überlegt, ob ich überhaupt wage, etwas dranzukleben... Andererseits lässt sich das rückstandslos zurückbauen - Zählerableser kommen bei uns sowieso nicht "spontan" ins Haus.

Bist du dir eigentlich wirklich sicher, dass der Infrarot-Sensor fehlerfrei arbeitet? Ich hatte zunächst auch ein Modul, mit dem keine zuverlässigen Erkennungen möglich waren. Da die Module ja nicht die Welt kosten, habe ich einfach ein anderes bestellt und das lief dann. Das erste Modul, das am Stromzähler vor sich gestottert hat, läuft inzwischen sehr zuverlässig am Gaszähler (zuverlässiger als der Hallsensor, der den meistens ziemlich unentschlossenen Reedkontakt ersetzen sollte).

Gesendet von meinem Nexus 5X mit Tapatalk
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Shojo am 29 Juni 2018, 09:10:47
Ich habe das auch mit den TCRT5000­ umsetzten können, war recht fummelig lauft aber nun sehr zuverlässig :) 

Gruß
Dennis
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: PeMue am 29 Juni 2018, 09:20:21
Hallo Dennis,

Zitat von: Shojo am 29 Juni 2018, 09:10:47
Ich habe das auch mit den TCRT5000­ umsetzten können, war recht fummelig lauft aber nun sehr zuverlässig :) 
hast Du einen Link auf das 3D Gehäuse, sieht echt gut aus.

Gruß PeMue
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Shojo am 29 Juni 2018, 09:21:53
Zitat von: PeMue am 29 Juni 2018, 09:20:21
Hallo Dennis,
hast Du einen Link auf das 3D Gehäuse, sieht echt gut aus.

Sicher (ist von so ein cooooolen Typen gemacht :D)
https://www.thingiverse.com/thing:2969084
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: dabuze am 02 Juli 2018, 19:13:16
Ich habs aufgegeben - der TCRT5000­ ist definitiv nicht auf meiner Seite.
Die neue Lösung besteht aus einer grünen LED und nem Photoresistor. Vor/Nachteil dabei ist ich kann/musste den Code zur Errechnung des Verbrauches selber schreiben. Dafür kann ich jetzt sehr SEHR genau messen ;)
Des funktioniert bisher erstaunlich gut. Ich habe mir einen entsprechenden Halter ausgedruckt um auch die Umgebungslicht-Empfindlichkeit zu reduzieren.
Bisher hatte ich nen Homematic Ferraris ES-Fer Zähler am Kasten hängen - der hatte auch schon arge Probleme mit der Erkennung und hat mitten in einer Umdrehung getriggert was zu absurden Ergebnissen geführt hat.

Nach einer kurzen Einspielung welche Werte der Sensor bei "Silber" bzw "Rot" liefert konnte ich also jede Umdrehung erfassen und direkt den aktuellen Verbrauch berechnen. Die Daten gehen via MQTT zu fhem.
Dort kann ich mir jederzeit die aktuellen SensorDaten ausgeben lassen und ggf via MQTT publish neue Werte senden.
Nun muss ich mir nur noch ne schöne Halterung für die NodeMCU drucken und dann kann ich mich auf die nächsten Probleme stürzen ; )
Danke jedenfalls an all für die Anteilnahme ; )

Grüße
Christian
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: alpha1974 am 03 Juli 2018, 19:13:28
Gibt es nähere Details (Schaltplan/Bestückung) der Variante Grüne LED + Photozelle?

Gesendet mit einem ortsungebundenen Telefonapparat via Tapatalk

Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: dabuze am 09 Juli 2018, 20:12:29
Hallo mal wieder.
Ich hatte die letzten Tage bissi mehr zu tun und konnte nicht mehr wirklich basteln geschweige denn mich melden.

Einen Schaltplan habe ich mal gezeichnet und auch meinen aktuellen Quellcode werde ich anhängen. Evtl. kann jemand etwas damit anfangen.
Ganz nach dem Motto "der Schuster hat die schlechtesten Schuhe" den Quellcode mit Bedacht einsetzen wobei es mittlerweile echt gut läuft ;)


SourceCode:


#include "ESP8266WiFi.h"
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);



#define D0 16
#define D1 5 // I2C Bus SCL (clock)
#define D2 4 // I2C Bus SDA (data)
#define D3 0
#define D4 2 // Same as "LED_BUILTIN", but inverted logic
#define D5 14 // SPI Bus SCK (clock)
#define D6 12 // SPI Bus MISO
#define D7 13 // SPI Bus MOSI
#define D8 15 // SPI Bus SS (CS)
#define D9 3 // RX0 (Serial console)
#define D10 1 // TX0 (Serial console)



// WiFi parameters
const char* ssid = "SID";
const char* password = "HierKönnteIhrPasswortStehen";
const char* mqtt_server = "Zahlen oder Hostname";


const char* outTopicPower     = "MCU_STROM/CurrentPower";
const char* outTopicTrigger   = "MCU_STROM/Trigger";
const char* outTopicLight     = "MCU_STROM/LightValue";
const char* inTopicValueRed   = "MCU_STROM/ValueRed";
const char* inTopicValueSilver= "MCU_STROM/ValueSilver";
const char* inTopicDebugMode  = "MCU_STROM/DebugMode";


int sensorValue;


int sensorValueRed;
int sensorValueSilver;

int sensorValueAutoCalibrationCheckTimes = 50;

int sensorValueRedAutoCalibration = 0;
int sensorValueRedAutoCalibrationTimes = 0;

int sensorValueSilverAutoCalibration = 0;
int sensorValueSilverAutoCalibrationTimes = 0;


boolean oRedDetected = false;
boolean oDebugMode = false;

unsigned long timeStamp = 0;
unsigned long timeStampForCheck = 0;
unsigned long timeToCheck = 25;

int nBufferCountRed     = 0;
int nBufferCountSilver  = 0;

void setup ()
{
  Serial.begin (115200);

  sensorValueRed   = 58;
  sensorValueSilver  = 65;

  // Turn on LED for contrast
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);

  Serial.println("Setup WiFi");
  setup_wifi();

  Serial.println("Setup Client");
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  Serial.println("Setup done"); 
}

void loop ()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 

  // read sensor every X milliseconds
  if (millis() - timeStampForCheck > timeToCheck)
  {
    timeStampForCheck = millis();
 
 
    // get value from sensor
    sensorValue = analogRead (A0);
//   Serial.println (sensorValue, DEC);

    if (oDebugMode == true)
    {
      String sSensorValue = String(sensorValue);
      client.publish(outTopicLight, (char*)sSensorValue.c_str());
      Serial.println (sensorValue, DEC);
   }
 
    if (sensorValue <= sensorValueRed && oRedDetected == false)
    {
      if (nBufferCountRed >= 2)
      {
        oRedDetected = true;
   
        // set bufferCount to 0. Used to check before setting trigger to False.
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
   
        // sent trigger value 1 to MQTT
        String sTriggerCount = "1";
        client.publish(outTopicTrigger, (char*)sTriggerCount.c_str());

        Serial.print("timeStamp: ");
        Serial.println(timeStamp);

       // start counting for energy
        if (timeStamp != 0)
        {
            unsigned long timeDiff = millis() - timeStamp;
            Serial.print ("timeDiff: ");
            Serial.println (timeDiff);
   
            float timeDiffSec = timeDiff / 1000;
   
            float energy = 0.006666 * (1/(timeDiffSec/3600));
            Serial.print ("energy in kW: ");
            Serial.println (energy);
   
            // get in Watt
            energy = energy * 1000;   
   
            String sCurrentPower = String(energy);
            client.publish(outTopicPower, (char*)sCurrentPower.c_str());

            // start auto calibration for red
            if (sensorValueRedAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
            {
              Serial.print("use sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for red calculation divided by [");
              Serial.print(sensorValueAutoCalibrationCheckTimes);
              Serial.print("] and base value: ");
              Serial.println(sensorValueRed);
             
              // calculate new red value
              int sensorValueRedTemp = sensorValueRedAutoCalibration / sensorValueAutoCalibrationCheckTimes;
              if (sensorValueRedTemp < sensorValueSilver)
              {
                // check if the RED value is below Silver - otherwise it will not work ; )

               
                sensorValueRed = sensorValueRedTemp;
 
                // add buffer to actual value
                sensorValueRed = sensorValueRed + 3;
 
                sensorValueRedAutoCalibration = 0;
                     
                Serial.print("new calculated sensorValueRed: ");
                Serial.println(sensorValueRed);
                sensorValueRedAutoCalibrationTimes = 0;
               
                String sNewSensorValueRed = String(sensorValueRed);
                client.publish(inTopicValueRed, (char*)sNewSensorValueRed.c_str());                   
              }
              else
              {
                // cleanup values.
                sensorValueRedAutoCalibration = 0;
                sensorValueRedAutoCalibrationTimes = 0;
              }
         
            }
            else
            {
              // sum value to get average
              sensorValueRedAutoCalibration = sensorValueRedAutoCalibration + sensorValue;
              sensorValueRedAutoCalibrationTimes++;

              Serial.print("have now sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for the [ ");
              Serial.print(sensorValueRedAutoCalibrationTimes);
              Serial.print("] run for current sensor value: ");
              Serial.println(sensorValue);

            }

        }
   
        timeStamp = millis();
      }
      else
      {
        nBufferCountRed++;
      }

    }
    else if (sensorValue >= sensorValueSilver && oRedDetected == true)
    {
      // check 10 times before set trigger back to false
      if (nBufferCountSilver >= 5)
      {
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
        oRedDetected = false;

        // start auto calibration for silver
        if (sensorValueSilverAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
        {
          // calculate new red value
          Serial.print("use sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for silver calculation divided by [");
          Serial.print(sensorValueAutoCalibrationCheckTimes);
          Serial.print("] and base value: ");
          Serial.println(sensorValueSilver);

          int sensorValueSilverTemp = sensorValueSilverAutoCalibration / sensorValueAutoCalibrationCheckTimes;
          if (sensorValueSilverTemp > sensorValueRed)
          {
            // check if SILVER is above red value

            sensorValueSilver = sensorValueSilverTemp;
                           
            Serial.print("new calculated sensorValueSilver: ");
            Serial.println(sensorValueSilver);
            sensorValueSilverAutoCalibrationTimes = 0;

            // add buffer to actual value
            sensorValueSilver = sensorValueSilver - 3;
             
            sensorValueSilverAutoCalibration = 0;

            String sNewSensorValueSilver = String(sensorValueSilver);
            client.publish(inTopicValueSilver, (char*)sNewSensorValueSilver.c_str()); 
 
          }
          else
          {
            sensorValueSilverAutoCalibration = 0;
            sensorValueSilverAutoCalibrationTimes = 0;
          }
 
        }
        else
        {
          // sum value to get average
          sensorValueSilverAutoCalibration = sensorValueSilverAutoCalibration + sensorValue;
          sensorValueSilverAutoCalibrationTimes++;

          Serial.print("have now sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for the [ ");
          Serial.print(sensorValueSilverAutoCalibrationTimes);
          Serial.print("] run for current sensor value: ");
          Serial.println(sensorValue);
        }       
      }
      else
      {
        nBufferCountSilver++;
      }
     
    }

  }

}




void setup_wifi() {

  delay(50);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.hostname("ESP_STROM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  delay(500);

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP_STROM")) {
      Serial.println("connected");

      client.subscribe(inTopicDebugMode);
      client.subscribe(inTopicValueRed);
      client.subscribe(inTopicValueSilver);
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 1,5 seconds");
      // Wait 5 seconds before retrying
      delay(1500);
    }
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

  String sMessage = "";
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
    sMessage += (char)payload[i];
  }
  Serial.println();

  if (strcmp (topic, inTopicValueRed) == 0 )
  {
    sensorValueRed = sMessage.toInt();
   
  }
  else if (strcmp (topic, inTopicValueSilver) == 0 )
  {
    sensorValueSilver = sMessage.toInt();
  }
  else if (strcmp (topic, inTopicDebugMode) == 0 )
  {
    oDebugMode = sMessage == "1";
    Serial.print("oDebugMode ");
    Serial.println(oDebugMode);
  }


 
}





fhem Code:


## define Stromzähler NodeMCU MQTT Device

define MCU_STROM MQTT_DEVICE
attr MCU_STROM subscribeReading_CurrentPower MCU_STROM/CurrentPower
attr MCU_STROM subscribeReading_Trigger MCU_STROM/Trigger
attr MCU_STROM subscribeReading_LightValue MCU_STROM/LightValue
attr MCU_STROM subscribeReading_ValueRed MCU_STROM/ValueRed
attr MCU_STROM subscribeReading_ValueSilver MCU_STROM/ValueSilver

attr MCU_STROM publishSet_DebugMode MCU_STROM/DebugMode
attr MCU_STROM publishSet_ValueRed MCU_STROM/ValueRed
attr MCU_STROM publishSet_ValueSilver MCU_STROM/ValueSilver



define MCU_STROM_DEBUG dummy
attr MCU_STROM_DEBUG webCmd state
attr MCU_STROM_DEBUG setList state:on,off
define N_MCU_STROM_DEBUG_OM notify MCU_STROM_DEBUG:on set MCU_STROM DebugMode 1
define N_MCU_STROM_DEBUG_OFF notify MCU_STROM_DEBUG:off set MCU_STROM DebugMode 0



Viel Spaß und viele Grüße ; )
Christian


*Edit - Bugfix in der Auto-Calibration der Helligkeit des Sensors für Rot/Silber...*

Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 24 August 2018, 13:14:09
Moin,

auch ich kämpfe grad mit meinem Stromzähler. Hab es erst mit dem TCRT5000 versucht. Dann hab ich mir grüne LEDs samt Phototransistor besorgt und die beiden mit https://www.thingiverse.com/thing:2829444 versucht und mit umgebautem TCRT5000 nach https://www.stall.biz/project/impulsgeber-fuer-den-wasserzaehler-selbst-gebaut
Aber auch das klappt noch nicht zufriedenstellend.
@dabuze: Hast das 3D-Model selbst gebaut? Magst mir das zur Verfügung stellen? Bin mittlerweile auch geneigt, den TCRT5000 ganz raus zu schmeißen und mit deinem Code zu arbeiten.
Glaub die Dinger sind einfach Mist.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: dabuze am 24 August 2018, 13:45:31
Servus Maui,

auch wenns peinlich ist findest du anbei die STL von mir - das Ding von Thingiverse schaut definitiv besser aus :)

Zwecks Code - oben ist noch das "Autoleveling" aktiv - das funktioniert bei mir leider doch nicht so gut - nach spätestens 5 Tagen haben sich die Werte für Rot und Silver verdreht.....
Ich betreibe das seitdem mit festen werden die ich bei bedarf über fhem anpassen kann. Läuft bisher 100% stabil. Silver=53 Red=47

Fall es interessiert - habe gestern in fhem rumgespielt um mir die Stromwerte umzurechnen.
Gesamtverbrauch kWh/Euro - Aktuelle Stunde - Letzte Stunde...

Achtung - Werte für Umdrehungen pro KWh und Stromkosten pro KWh sind fest...kann man sicher auch schöner realisieren. :)


## Stündlich den Verbrauch speichern:
define at_STROM_HOUR at +*01:00:00 {
my $CurrentHourCount = ReadingsVal ('MCU_STROM','Trigger_Current_Hour','0');;
fhem ("setreading MCU_STROM Trigger_Last_Hour $CurrentHourCount");;

fhem ("setreading MCU_STROM Trigger_Current_Hour 0");;

my $PowerLastHourUsed = ReadingsVal ('MCU_STROM','Trigger_Last_Hour','0')/150;;
fhem ("setreading MCU_STROM PowerLastHourUsed $PowerLastHourUsed");;

my $PowerLastHourCost = ReadingsVal ('MCU_STROM','Trigger_Last_Hour','0')/150*0.22;;
fhem ("setreading MCU_STROM PowerLastHourCost $PowerLastHourCost");;
}


attr at_STROM_HOUR alignTime 00:00



# notify für Stromzähler. Wird aktiviert wenn CurrentPower wert kommt

define N_MCU_STROM_TRIGGER_COUNT notify MCU_STROM:CurrentPower:.* {
my $CurrentCount = ReadingsVal ('MCU_STROM','Trigger_Sum','0')+1;;
fhem ("setreading MCU_STROM Trigger_Sum $CurrentCount");;

my $PowerAllUsed = ReadingsVal ('MCU_STROM','Trigger_Sum','0')/150;;
fhem ("setreading MCU_STROM PowerAllUsed $PowerAllUsed");;

my $PowerAllCost = ReadingsVal ('MCU_STROM','Trigger_Sum','0')/150*0.22;;
fhem ("setreading MCU_STROM PowerAllCost $PowerAllCost");;

my $CurrentHourCount = ReadingsVal ('MCU_STROM','Trigger_Current_Hour','0')+1;;
fhem ("setreading MCU_STROM Trigger_Current_Hour $CurrentHourCount");;


my $PowerCurrentHourUsed = ReadingsVal ('MCU_STROM','Trigger_Current_Hour','0')/150;;
fhem ("setreading MCU_STROM PowerCurrentHourUsed $PowerCurrentHourUsed");;

my $PowerCurrentHourCost = ReadingsVal ('MCU_STROM','Trigger_Current_Hour','0')/150*0.22;;
fhem ("setreading MCU_STROM PowerCurrentHourCost $PowerCurrentHourCost");;

}




## Stateformat:
{ 'Current KWh: '.sprintf("%.2f",ReadingsVal("MCU_STROM","CurrentPower","0")).' 
All €: '.sprintf("%.2f",ReadingsVal("MCU_STROM","PowerAllCost","0")).' 
Hour €: '.sprintf("%.2f",ReadingsVal("MCU_STROM","PowerCurrentHourCost","0")).'
Last Hour €: '.sprintf("%.2f",ReadingsVal("MCU_STROM","PowerLastHourCost","0")).'' }




Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 25 August 2018, 20:47:50
Danke dir. Endlich läuft es. Dein Modell hat echt noch optimierungsbedarf  ;)
Aber faul wie ich bin habe ich's genommen und mit heisskleber nachgeholfen.
Jetzt mal die erste Nacht schauen, wie stabil es läuft. Aber bisher ziemlich gut.
Endlich kann ich da ein Haken hinter machen
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 26 August 2018, 11:46:54
So, nach der ersten Nacht kann ich sagen. Läuft super. Danke für deine Hilfe und den Code. Habe ihn fast 1:1 laufen, habe nur die Kalibrierung raus genommen und den Counter von 2 auf 4 gesetzt. Habe einen Zähler mit 75 Umdrehungen bis zur kWh und hab mal grob überschlagen. Im schlimmsten Fall bekomme ich nur 8 Signale mit red. Du hast ja einen 150er Zähler, also quasi das gleiche, da deiner doppelt so schnell dreht. Auch die Berechnungen habe ich von dir übernommen und angepasst. Ich bau mir jetzt noch eine für Standby (Strom nachts) und eine für den letzten Tag. Stelle ich dann noch hier rein, falls es mal wem hilft.
Bei mir ist zwar der Abstand zwischen rot und silber ziemlich klein, 8 gegen 12, aber dafür läuft es erstaunlich sauber.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Dr.E.Witz am 02 April 2019, 23:08:11
Zitat von: dabuze am 09 Juli 2018, 20:12:29
Hallo mal wieder.
Ich hatte die letzten Tage bissi mehr zu tun und konnte nicht mehr wirklich basteln geschweige denn mich melden.

Einen Schaltplan habe ich mal gezeichnet und auch meinen aktuellen Quellcode werde ich anhängen. Evtl. kann jemand etwas damit anfangen.
Ganz nach dem Motto "der Schuster hat die schlechtesten Schuhe" den Quellcode mit Bedacht einsetzen wobei es mittlerweile echt gut läuft ;)


SourceCode:



Hättest Du noch die verwendeten Bauteile?
Danke und Gruß,

Michael
#include "ESP8266WiFi.h"
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);



#define D0 16
#define D1 5 // I2C Bus SCL (clock)
#define D2 4 // I2C Bus SDA (data)
#define D3 0
#define D4 2 // Same as "LED_BUILTIN", but inverted logic
#define D5 14 // SPI Bus SCK (clock)
#define D6 12 // SPI Bus MISO
#define D7 13 // SPI Bus MOSI
#define D8 15 // SPI Bus SS (CS)
#define D9 3 // RX0 (Serial console)
#define D10 1 // TX0 (Serial console)



// WiFi parameters
const char* ssid = "SID";
const char* password = "HierKönnteIhrPasswortStehen";
const char* mqtt_server = "Zahlen oder Hostname";


const char* outTopicPower     = "MCU_STROM/CurrentPower";
const char* outTopicTrigger   = "MCU_STROM/Trigger";
const char* outTopicLight     = "MCU_STROM/LightValue";
const char* inTopicValueRed   = "MCU_STROM/ValueRed";
const char* inTopicValueSilver= "MCU_STROM/ValueSilver";
const char* inTopicDebugMode  = "MCU_STROM/DebugMode";


int sensorValue;


int sensorValueRed;
int sensorValueSilver;

int sensorValueAutoCalibrationCheckTimes = 50;

int sensorValueRedAutoCalibration = 0;
int sensorValueRedAutoCalibrationTimes = 0;

int sensorValueSilverAutoCalibration = 0;
int sensorValueSilverAutoCalibrationTimes = 0;


boolean oRedDetected = false;
boolean oDebugMode = false;

unsigned long timeStamp = 0;
unsigned long timeStampForCheck = 0;
unsigned long timeToCheck = 25;

int nBufferCountRed     = 0;
int nBufferCountSilver  = 0;

void setup ()
{
  Serial.begin (115200);

  sensorValueRed   = 58;
  sensorValueSilver  = 65;

  // Turn on LED for contrast
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);

  Serial.println("Setup WiFi");
  setup_wifi();

  Serial.println("Setup Client");
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  Serial.println("Setup done"); 
}

void loop ()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 

  // read sensor every X milliseconds
  if (millis() - timeStampForCheck > timeToCheck)
  {
    timeStampForCheck = millis();
 
 
    // get value from sensor
    sensorValue = analogRead (A0);
//   Serial.println (sensorValue, DEC);

    if (oDebugMode == true)
    {
      String sSensorValue = String(sensorValue);
      client.publish(outTopicLight, (char*)sSensorValue.c_str());
      Serial.println (sensorValue, DEC);
   }
 
    if (sensorValue <= sensorValueRed && oRedDetected == false)
    {
      if (nBufferCountRed >= 2)
      {
        oRedDetected = true;
   
        // set bufferCount to 0. Used to check before setting trigger to False.
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
   
        // sent trigger value 1 to MQTT
        String sTriggerCount = "1";
        client.publish(outTopicTrigger, (char*)sTriggerCount.c_str());

        Serial.print("timeStamp: ");
        Serial.println(timeStamp);

       // start counting for energy
        if (timeStamp != 0)
        {
            unsigned long timeDiff = millis() - timeStamp;
            Serial.print ("timeDiff: ");
            Serial.println (timeDiff);
   
            float timeDiffSec = timeDiff / 1000;
   
            float energy = 0.006666 * (1/(timeDiffSec/3600));
            Serial.print ("energy in kW: ");
            Serial.println (energy);
   
            // get in Watt
            energy = energy * 1000;   
   
            String sCurrentPower = String(energy);
            client.publish(outTopicPower, (char*)sCurrentPower.c_str());

            // start auto calibration for red
            if (sensorValueRedAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
            {
              Serial.print("use sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for red calculation divided by [");
              Serial.print(sensorValueAutoCalibrationCheckTimes);
              Serial.print("] and base value: ");
              Serial.println(sensorValueRed);
             
              // calculate new red value
              int sensorValueRedTemp = sensorValueRedAutoCalibration / sensorValueAutoCalibrationCheckTimes;
              if (sensorValueRedTemp < sensorValueSilver)
              {
                // check if the RED value is below Silver - otherwise it will not work ; )

               
                sensorValueRed = sensorValueRedTemp;
 
                // add buffer to actual value
                sensorValueRed = sensorValueRed + 3;
 
                sensorValueRedAutoCalibration = 0;
                     
                Serial.print("new calculated sensorValueRed: ");
                Serial.println(sensorValueRed);
                sensorValueRedAutoCalibrationTimes = 0;
               
                String sNewSensorValueRed = String(sensorValueRed);
                client.publish(inTopicValueRed, (char*)sNewSensorValueRed.c_str());                   
              }
              else
              {
                // cleanup values.
                sensorValueRedAutoCalibration = 0;
                sensorValueRedAutoCalibrationTimes = 0;
              }
         
            }
            else
            {
              // sum value to get average
              sensorValueRedAutoCalibration = sensorValueRedAutoCalibration + sensorValue;
              sensorValueRedAutoCalibrationTimes++;

              Serial.print("have now sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for the [ ");
              Serial.print(sensorValueRedAutoCalibrationTimes);
              Serial.print("] run for current sensor value: ");
              Serial.println(sensorValue);

            }

        }
   
        timeStamp = millis();
      }
      else
      {
        nBufferCountRed++;
      }

    }
    else if (sensorValue >= sensorValueSilver && oRedDetected == true)
    {
      // check 10 times before set trigger back to false
      if (nBufferCountSilver >= 5)
      {
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
        oRedDetected = false;

        // start auto calibration for silver
        if (sensorValueSilverAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
        {
          // calculate new red value
          Serial.print("use sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for silver calculation divided by [");
          Serial.print(sensorValueAutoCalibrationCheckTimes);
          Serial.print("] and base value: ");
          Serial.println(sensorValueSilver);

          int sensorValueSilverTemp = sensorValueSilverAutoCalibration / sensorValueAutoCalibrationCheckTimes;
          if (sensorValueSilverTemp > sensorValueRed)
          {
            // check if SILVER is above red value

            sensorValueSilver = sensorValueSilverTemp;
                           
            Serial.print("new calculated sensorValueSilver: ");
            Serial.println(sensorValueSilver);
            sensorValueSilverAutoCalibrationTimes = 0;

            // add buffer to actual value
            sensorValueSilver = sensorValueSilver - 3;
             
            sensorValueSilverAutoCalibration = 0;

            String sNewSensorValueSilver = String(sensorValueSilver);
            client.publish(inTopicValueSilver, (char*)sNewSensorValueSilver.c_str()); 
 
          }
          else
          {
            sensorValueSilverAutoCalibration = 0;
            sensorValueSilverAutoCalibrationTimes = 0;
          }
 
        }
        else
        {
          // sum value to get average
          sensorValueSilverAutoCalibration = sensorValueSilverAutoCalibration + sensorValue;
          sensorValueSilverAutoCalibrationTimes++;

          Serial.print("have now sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for the [ ");
          Serial.print(sensorValueSilverAutoCalibrationTimes);
          Serial.print("] run for current sensor value: ");
          Serial.println(sensorValue);
        }       
      }
      else
      {
        nBufferCountSilver++;
      }
     
    }

  }

}




void setup_wifi() {

  delay(50);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.hostname("ESP_STROM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  delay(500);

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP_STROM")) {
      Serial.println("connected");

      client.subscribe(inTopicDebugMode);
      client.subscribe(inTopicValueRed);
      client.subscribe(inTopicValueSilver);
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 1,5 seconds");
      // Wait 5 seconds before retrying
      delay(1500);
    }
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

  String sMessage = "";
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
    sMessage += (char)payload[i];
  }
  Serial.println();

  if (strcmp (topic, inTopicValueRed) == 0 )
  {
    sensorValueRed = sMessage.toInt();
   
  }
  else if (strcmp (topic, inTopicValueSilver) == 0 )
  {
    sensorValueSilver = sMessage.toInt();
  }
  else if (strcmp (topic, inTopicDebugMode) == 0 )
  {
    oDebugMode = sMessage == "1";
    Serial.print("oDebugMode ");
    Serial.println(oDebugMode);
  }


 
}





fhem Code:


## define Stromzähler NodeMCU MQTT Device

define MCU_STROM MQTT_DEVICE
attr MCU_STROM subscribeReading_CurrentPower MCU_STROM/CurrentPower
attr MCU_STROM subscribeReading_Trigger MCU_STROM/Trigger
attr MCU_STROM subscribeReading_LightValue MCU_STROM/LightValue
attr MCU_STROM subscribeReading_ValueRed MCU_STROM/ValueRed
attr MCU_STROM subscribeReading_ValueSilver MCU_STROM/ValueSilver

attr MCU_STROM publishSet_DebugMode MCU_STROM/DebugMode
attr MCU_STROM publishSet_ValueRed MCU_STROM/ValueRed
attr MCU_STROM publishSet_ValueSilver MCU_STROM/ValueSilver



define MCU_STROM_DEBUG dummy
attr MCU_STROM_DEBUG webCmd state
attr MCU_STROM_DEBUG setList state:on,off
define N_MCU_STROM_DEBUG_OM notify MCU_STROM_DEBUG:on set MCU_STROM DebugMode 1
define N_MCU_STROM_DEBUG_OFF notify MCU_STROM_DEBUG:off set MCU_STROM DebugMode 0



Viel Spaß und viele Grüße ; )
Christian


*Edit - Bugfix in der Auto-Calibration der Helligkeit des Sensors für Rot/Silber...*
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 25 Juni 2019, 08:41:08
Hallo zusammen,

ich verwende seit ein paar Wochen ebenfalls den TRCT5000 in Verbindung mit einem D1 Mini. Einbindung und Auswertung in FHEM funktioniert prima, leider funktioniert das Konstrukt immer nur wenige Tage, dann muss ich am Sensor die Empfindlichkeit neu justieren (Zähler wird meistens zu empfindlich und zählt dann auch Stellen die nicht rot markiert sind).

Anfangs dachte ich, es liegt am Klebeband welches sich immer wieder verschiebt. Das Gehäuse habe ich mittlerweile mit drei Heißklebepunkten fixiert und kann ausgeschlossen werden.

Kennt jemand vielleicht die Ursache? Den Sensor habe ich bereits getauscht, gleiches Ergebnis. Die Poti Einstellung habe ich nach einer justierung markiert, hier ändert sich zumindest optisch nichts, dennoch muss nachjustiert werden... Gibt es vielleicht noch bessere Sensoren?

Viele Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 25 Juni 2019, 10:27:31
Moin du brauchst doch nur den Thread hier durchlesen.
Zwar kein Fertig Sensor, aber funktioniert dafür bestens.

Gruß
Maui
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 11 Juli 2019, 09:32:19
Zitat von: dabuze am 09 Juli 2018, 20:12:29
Hallo mal wieder.
Ich hatte die letzten Tage bissi mehr zu tun und konnte nicht mehr wirklich basteln geschweige denn mich melden.

Einen Schaltplan habe ich mal gezeichnet und auch meinen aktuellen Quellcode werde ich anhängen. Evtl. kann jemand etwas damit anfangen.
Ganz nach dem Motto "der Schuster hat die schlechtesten Schuhe" den Quellcode mit Bedacht einsetzen wobei es mittlerweile echt gut läuft ;)


SourceCode:


#include "ESP8266WiFi.h"
#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);



#define D0 16
#define D1 5 // I2C Bus SCL (clock)
#define D2 4 // I2C Bus SDA (data)
#define D3 0
#define D4 2 // Same as "LED_BUILTIN", but inverted logic
#define D5 14 // SPI Bus SCK (clock)
#define D6 12 // SPI Bus MISO
#define D7 13 // SPI Bus MOSI
#define D8 15 // SPI Bus SS (CS)
#define D9 3 // RX0 (Serial console)
#define D10 1 // TX0 (Serial console)



// WiFi parameters
const char* ssid = "SID";
const char* password = "HierKönnteIhrPasswortStehen";
const char* mqtt_server = "Zahlen oder Hostname";


const char* outTopicPower     = "MCU_STROM/CurrentPower";
const char* outTopicTrigger   = "MCU_STROM/Trigger";
const char* outTopicLight     = "MCU_STROM/LightValue";
const char* inTopicValueRed   = "MCU_STROM/ValueRed";
const char* inTopicValueSilver= "MCU_STROM/ValueSilver";
const char* inTopicDebugMode  = "MCU_STROM/DebugMode";


int sensorValue;


int sensorValueRed;
int sensorValueSilver;

int sensorValueAutoCalibrationCheckTimes = 50;

int sensorValueRedAutoCalibration = 0;
int sensorValueRedAutoCalibrationTimes = 0;

int sensorValueSilverAutoCalibration = 0;
int sensorValueSilverAutoCalibrationTimes = 0;


boolean oRedDetected = false;
boolean oDebugMode = false;

unsigned long timeStamp = 0;
unsigned long timeStampForCheck = 0;
unsigned long timeToCheck = 25;

int nBufferCountRed     = 0;
int nBufferCountSilver  = 0;

void setup ()
{
  Serial.begin (115200);

  sensorValueRed   = 58;
  sensorValueSilver  = 65;

  // Turn on LED for contrast
  pinMode(D1, OUTPUT);
  digitalWrite(D1, HIGH);

  Serial.println("Setup WiFi");
  setup_wifi();

  Serial.println("Setup Client");
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);

  Serial.println("Setup done"); 
}

void loop ()
{
  if (!client.connected()) {
    reconnect();
  }
  client.loop(); 

  // read sensor every X milliseconds
  if (millis() - timeStampForCheck > timeToCheck)
  {
    timeStampForCheck = millis();
 
 
    // get value from sensor
    sensorValue = analogRead (A0);
//   Serial.println (sensorValue, DEC);

    if (oDebugMode == true)
    {
      String sSensorValue = String(sensorValue);
      client.publish(outTopicLight, (char*)sSensorValue.c_str());
      Serial.println (sensorValue, DEC);
   }
 
    if (sensorValue <= sensorValueRed && oRedDetected == false)
    {
      if (nBufferCountRed >= 2)
      {
        oRedDetected = true;
   
        // set bufferCount to 0. Used to check before setting trigger to False.
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
   
        // sent trigger value 1 to MQTT
        String sTriggerCount = "1";
        client.publish(outTopicTrigger, (char*)sTriggerCount.c_str());

        Serial.print("timeStamp: ");
        Serial.println(timeStamp);

       // start counting for energy
        if (timeStamp != 0)
        {
            unsigned long timeDiff = millis() - timeStamp;
            Serial.print ("timeDiff: ");
            Serial.println (timeDiff);
   
            float timeDiffSec = timeDiff / 1000;
   
            float energy = 0.006666 * (1/(timeDiffSec/3600));
            Serial.print ("energy in kW: ");
            Serial.println (energy);
   
            // get in Watt
            energy = energy * 1000;   
   
            String sCurrentPower = String(energy);
            client.publish(outTopicPower, (char*)sCurrentPower.c_str());

            // start auto calibration for red
            if (sensorValueRedAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
            {
              Serial.print("use sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for red calculation divided by [");
              Serial.print(sensorValueAutoCalibrationCheckTimes);
              Serial.print("] and base value: ");
              Serial.println(sensorValueRed);
             
              // calculate new red value
              int sensorValueRedTemp = sensorValueRedAutoCalibration / sensorValueAutoCalibrationCheckTimes;
              if (sensorValueRedTemp < sensorValueSilver)
              {
                // check if the RED value is below Silver - otherwise it will not work ; )

               
                sensorValueRed = sensorValueRedTemp;
 
                // add buffer to actual value
                sensorValueRed = sensorValueRed + 3;
 
                sensorValueRedAutoCalibration = 0;
                     
                Serial.print("new calculated sensorValueRed: ");
                Serial.println(sensorValueRed);
                sensorValueRedAutoCalibrationTimes = 0;
               
                String sNewSensorValueRed = String(sensorValueRed);
                client.publish(inTopicValueRed, (char*)sNewSensorValueRed.c_str());                   
              }
              else
              {
                // cleanup values.
                sensorValueRedAutoCalibration = 0;
                sensorValueRedAutoCalibrationTimes = 0;
              }
         
            }
            else
            {
              // sum value to get average
              sensorValueRedAutoCalibration = sensorValueRedAutoCalibration + sensorValue;
              sensorValueRedAutoCalibrationTimes++;

              Serial.print("have now sensorValueRedAutoCalibration [");
              Serial.print(sensorValueRedAutoCalibration);
              Serial.print("] for the [ ");
              Serial.print(sensorValueRedAutoCalibrationTimes);
              Serial.print("] run for current sensor value: ");
              Serial.println(sensorValue);

            }

        }
   
        timeStamp = millis();
      }
      else
      {
        nBufferCountRed++;
      }

    }
    else if (sensorValue >= sensorValueSilver && oRedDetected == true)
    {
      // check 10 times before set trigger back to false
      if (nBufferCountSilver >= 5)
      {
        nBufferCountSilver = 0;
        nBufferCountRed = 0;
        oRedDetected = false;

        // start auto calibration for silver
        if (sensorValueSilverAutoCalibrationTimes >= sensorValueAutoCalibrationCheckTimes)
        {
          // calculate new red value
          Serial.print("use sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for silver calculation divided by [");
          Serial.print(sensorValueAutoCalibrationCheckTimes);
          Serial.print("] and base value: ");
          Serial.println(sensorValueSilver);

          int sensorValueSilverTemp = sensorValueSilverAutoCalibration / sensorValueAutoCalibrationCheckTimes;
          if (sensorValueSilverTemp > sensorValueRed)
          {
            // check if SILVER is above red value

            sensorValueSilver = sensorValueSilverTemp;
                           
            Serial.print("new calculated sensorValueSilver: ");
            Serial.println(sensorValueSilver);
            sensorValueSilverAutoCalibrationTimes = 0;

            // add buffer to actual value
            sensorValueSilver = sensorValueSilver - 3;
             
            sensorValueSilverAutoCalibration = 0;

            String sNewSensorValueSilver = String(sensorValueSilver);
            client.publish(inTopicValueSilver, (char*)sNewSensorValueSilver.c_str()); 
 
          }
          else
          {
            sensorValueSilverAutoCalibration = 0;
            sensorValueSilverAutoCalibrationTimes = 0;
          }
 
        }
        else
        {
          // sum value to get average
          sensorValueSilverAutoCalibration = sensorValueSilverAutoCalibration + sensorValue;
          sensorValueSilverAutoCalibrationTimes++;

          Serial.print("have now sensorValueSilverAutoCalibration [");
          Serial.print(sensorValueSilverAutoCalibration);
          Serial.print("] for the [ ");
          Serial.print(sensorValueSilverAutoCalibrationTimes);
          Serial.print("] run for current sensor value: ");
          Serial.println(sensorValue);
        }       
      }
      else
      {
        nBufferCountSilver++;
      }
     
    }

  }

}




void setup_wifi() {

  delay(50);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.hostname("ESP_STROM");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  delay(500);

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}


void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP_STROM")) {
      Serial.println("connected");

      client.subscribe(inTopicDebugMode);
      client.subscribe(inTopicValueRed);
      client.subscribe(inTopicValueSilver);
     
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 1,5 seconds");
      // Wait 5 seconds before retrying
      delay(1500);
    }
  }
}


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");

  String sMessage = "";
  for (int i=0;i<length;i++) {
    Serial.print((char)payload[i]);
    sMessage += (char)payload[i];
  }
  Serial.println();

  if (strcmp (topic, inTopicValueRed) == 0 )
  {
    sensorValueRed = sMessage.toInt();
   
  }
  else if (strcmp (topic, inTopicValueSilver) == 0 )
  {
    sensorValueSilver = sMessage.toInt();
  }
  else if (strcmp (topic, inTopicDebugMode) == 0 )
  {
    oDebugMode = sMessage == "1";
    Serial.print("oDebugMode ");
    Serial.println(oDebugMode);
  }


 
}





fhem Code:


## define Stromzähler NodeMCU MQTT Device

define MCU_STROM MQTT_DEVICE
attr MCU_STROM subscribeReading_CurrentPower MCU_STROM/CurrentPower
attr MCU_STROM subscribeReading_Trigger MCU_STROM/Trigger
attr MCU_STROM subscribeReading_LightValue MCU_STROM/LightValue
attr MCU_STROM subscribeReading_ValueRed MCU_STROM/ValueRed
attr MCU_STROM subscribeReading_ValueSilver MCU_STROM/ValueSilver

attr MCU_STROM publishSet_DebugMode MCU_STROM/DebugMode
attr MCU_STROM publishSet_ValueRed MCU_STROM/ValueRed
attr MCU_STROM publishSet_ValueSilver MCU_STROM/ValueSilver



define MCU_STROM_DEBUG dummy
attr MCU_STROM_DEBUG webCmd state
attr MCU_STROM_DEBUG setList state:on,off
define N_MCU_STROM_DEBUG_OM notify MCU_STROM_DEBUG:on set MCU_STROM DebugMode 1
define N_MCU_STROM_DEBUG_OFF notify MCU_STROM_DEBUG:off set MCU_STROM DebugMode 0



Viel Spaß und viele Grüße ; )
Christian


*Edit - Bugfix in der Auto-Calibration der Helligkeit des Sensors für Rot/Silber...*

Die Lösung scheint interessant, ich gebe es auf mit dem TRCT5000...
Welche Widerstände werden benötigt und wie hell sollte die grüne LED sein?

Viele Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 11 Juli 2019, 13:56:54
Zitat von: huhu am 11 Juli 2019, 09:32:19
Die Lösung scheint interessant, ich gebe es auf mit dem TRCT5000...
Welche Widerstände werden benötigt und wie hell sollte die grüne LED sein?

Viele Grüße
huhu
Moin. Ich meine die Widerstände habe ich grob wie im Link unter #13 gewählt. LED sollte halt irgendwo bei 200-300 liegen.
Ich habe einfach eine ziemlich helle grüne von CONRAD damals genommen. So teuer sind die ja nicht und du stellst ja die Flanken selbst ein.
Ich würde einfach 1-2 kaufen und ausprobieren. (Bei Reichelt ist mEn immer noch Versand frei bei Bezahlung mit paydirekt)

Gruß
Maui
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: PeMue am 11 Juli 2019, 15:26:03
Zitat von: Maui am 11 Juli 2019, 13:56:54
Bei Reichelt ist mEn immer noch Versand frei bei Bezahlung mit paydirekt.
stimmt, bis 17.07. (https://www.reichelt.de/paydirekt-l1911.html?r=1)

Gruß Peter
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 12 Juli 2019, 12:58:54
Besten Dank!

LED und Fototransistor habe ich, allerdings bin ich mir unsicher welchen Widerstand ich brauche? Auf was muss ich achten, bzw wie kann ich errechnen welcher Widerstand passt?

Danke&Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 12 Juli 2019, 13:37:11
Moin. ich würde da keine Raketen Wissenschaft draus machen.
Die LED würde auch ohne Widerstand laufen aber nimm 200 oder 300.
und beim Transistor würde ich einfach wie erwähnt einen 100k Widerstand nehmen.
Ich denke bei der LED ist das halt nur als Vorwiderstand und beim Transistor ein Pull-Up der einfach gross sein muss.
Aber nagel mich nicht auf mein Halbwissen fest.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 12 Juli 2019, 14:59:17
Danke,
ich habe mal ein paar bestellt!
Benutzt du als Basis den TCRT5000 noch wie bei stall.biz beschrieben?
Funktioniert das ganze auch mit einem D1 Mini?
Mein aktuelles Setup in fhem (ElectricityCalculator) ist nicht mehr nutzbar?

Viele Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 12 Juli 2019, 15:39:58
ne ich nutze das mit D1 Mini.
klar in fhem brauchst nicht viel ändern nur ein neues device mit den passenden mqtt subscribes.
kannst weiterhin electr. calc. nehmen.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 20 Juli 2019, 08:35:28
Morgen Maui,
klingt gut, momentan ist ESPEasy auf dem D1 Mini. Kann man das Device über die GUI zusammenbauen, oder wäre es besser hier den Source Code zu verwenden?

Viele Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 20 Juli 2019, 08:47:30
Das wirst du mit espEasy oder tasmota nicht hinbekommen.
Musst den Code aufspielen.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 20 Juli 2019, 17:46:43
Habe ich noch nie gemacht, wie stelle ich das am besten an?

Viele Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 20 Juli 2019, 20:14:19
Am besten mit Arduino IDE.
Am besten du googelst einfach mal nach anleitungen oder guckst bei youtube.
Und wenn du konkrete Fragen noch hast dann schiess einfach los   ;)
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 24 Juli 2019, 12:23:31
Flashen hat funktioniert, danke :)
Und schon die nächste Frage, an welchen Port muss der Transistor angeschlossen werden? 5V und Ground klar, welcher ist für data?
Werde aus dem Sketch nicht schlau.

Edit: Anschlussplan gefunden ;)

Viele Grüße
huhu
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 24 Juli 2019, 13:28:55
Wer suchet...,
Wenn alles klappt musst du nur noch die Schwellen einstellen und den MQTT Server festlegen.

Gruß
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 24 Juli 2019, 13:33:25
Bei mir schwankt der Wert zwischen 4 und 5 nur, egal ob mit oder ohne grüne LED.
Beim D1Mini wird auch A0 verwendet?

FT kurzes Bein - Widerstand - Ground + A0
FT langes Bein - 3.3V

LED kurzes Bein - Widerstand - Ground
LED langes Bein - 3.3V
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 24 Juli 2019, 14:19:15
Schau dir das ganze mal im serial plotter direkt an pc angeschlossen an.
Und dann mach einen Staubsauger oä Fresser an ;)
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 24 Juli 2019, 14:43:41
Soweit bin ich noch nicht ;)
LightValue sollte sich auch ohne Ferraris ändern je nach Farbe/Untergrund?
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 24 Juli 2019, 15:09:53
Ja müsste. Schon lange her aber Hand drauf (abdunkeln) und Handy LED sollten einen Unterschied ausmachen.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: huhu am 29 Juli 2019, 20:23:10
hmm also LightValue bleibt bei mir immer bei 4, manchmal ganz kurz 5. CurrentPower dagegen ändert sich... Meines Erachtens sollte sich doch LightValue ändern, damit ich bestimmen kann was rot und silber ist? Oder habe ich da einen Denkfehler?
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 29 Juli 2019, 22:38:00
Wie ist denn dein aktuelles Setup?
Ich denke du machst es dir zu schwer grad.
Hast du ein laptop?
Dann setz dich mit wemos angeschlossen (und bier) vor den Zähler und nutze den serial monitor oder besser plotter.
Kann sein dass du den debug mode im code auf true setzen musst (ist echt lange her).

Wenn du das alles erst mal am Schreibtisch testen willst dann mach den Test mit serial eben da.  ;)
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 19 August 2019, 13:44:24
Es ist immer schön, wenn man schreibt ob es geklappt hat oder man das Projekt an den Nagel gehängt hat.
Zumindest für die Motivation beim nächsten mit Problemen zu antworten.
Titel: andere Frage zur Ferraris Scheibe
Beitrag von: Layer0 am 13 Juni 2020, 11:54:30
Hallo Gemeinde,
ich hab mal die suche hier bemüht.
Zu meiner Frage denn passendestn Fred, meine ich diesen hier gefunden zu haben.

Ich hab den TCRT5000 erfolgreich am Zähler. Er findet valide die rote Markeirung

Frage: weiviel Strom ist verbraucht, wenn das Rad eine Runde gedreht hat?
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Maui am 13 Juni 2020, 11:56:29
Steht doch auf dem Zähler.
Gängig sind 55/75/96 U pro KWh.

Gönne dir das der tcrt ordentlich zählt aber bezweifel es. Der rät leider (bei mir) nur und war nicht zu gebrauchen.
Titel: Antw:TCRT5000­ erkennt Ferraris Scheibe nicht - was kann ich tun?
Beitrag von: Layer0 am 13 Juni 2020, 12:04:21
OK danke

naja ... da steht sehr viel drauf
wenn man weiss dass eine Angabe 96 U/kwh sich darauf bezieht dann ist es klar