Suche Howto zu HTTPMOD (Waschmaschine fertig Meldung)

Begonnen von rogseut, 17 Januar 2015, 10:57:15

Vorheriges Thema - Nächstes Thema

rogseut

Hallo zusammen.

Konkret geht es darum von einer Webseite Daten auszulesen und in eine dummy variable zu schreiben. Habe dazu schon eine kleine Test Seite angelegt mit 4 Werten. Währe schön wenn mir jemand die Syntax vom Httpmod und der anderen Befehle genauer erklären könnte. Aus den Wiki Anleitungen werde ich nicht so richtig schlau. Schön währe ein einfaches Beispiel. Thx

rogseut


Freibeuter


rogseut

So ganz funktionierts noch nicht.
Kann mir jemand helfen?
Bin blutiger Anfänger bitte um Verständniss.
Quelltext der Website:

Leistung_X1: 1025.83<br />
Strom_X1: 4.46<br />
Leistung_X2: 1031.14<br />
Strom_X2: 4.48<br />
</html>

Quelltext in FHEM

#
define powermonitor HTTPMOD 192.168.0.122 10
attr powermonitor readingsName.1 Leistung_X1
attr powermonitor readingsName.2 Strom_X1
attr powermonitor readingsName.3 Leistung_X2
attr powermonitor readingsName.4 Strom_X2
attr powermonitor readingsRegex.1 Leistung_X1:\s\d+/.\d+/
attr powermonitor readingsRegex.2 Strom_X1:\s\d+/.\d+/
attr powermonitor readingsRegex.3 Leistung_X2:\s\d+/.\d+/
attr powermonitor readingsRegex.4 Leistung_X2:\s\d+/.\d+/
attr powermonitor stateFormat Mein: Leistung_X1
attr powermonitor timeout 10
attr powermonitor verbose 1

######################################

define Messwerte readingsGroup <Anschluss>,<Wert> powermonitor:Leistung_X1:
attr Messwerte group Leistung
attr Messwerte room Keller
attr Messwerte style style="font-size:16px"



Icinger

Guten Morgen,

Zitatreading[0-9]*Regex ro readingsRegex.*
defines the regex to be used for extracting the reading. The value to extract should be in a sub expression e.g. ([\d\.]+) in the above example

Du musst den Wert, den du mittel RegEx extrahieren willst, in eine Gruppe stecken, also zB:
attr powermonitor readingsRegex.1 Leistung_X1: ([0-9.]+)

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

rogseut

#5
Kaum macht man es richtig funktionierts auch :-) siehe Screenshot
THX Icinger

Suche jedoch noch nach einer Lösung um hinter den Wert noch die Einheit zu schreiben.
Desweiteren möchte ich den Anzeige Namen ändern so das aus powermonitor:Leistung_X1, z.B. die "Waschmaschine" wird.
Wie funktioniert das?

Warum ist der Zeitstempel nach dem ersten Aufruf grau und nach dem zweiten dann dauerhaft rot?


#
define powermonitor HTTPMOD http://192.168.0.122/ 10

attr powermonitor readingsName1 Leistung_X1
attr powermonitor readingsName2 Strom_X1
attr powermonitor readingsName3 Leistung_X2
attr powermonitor readingsName4 Strom_X2

attr powermonitor readingsRegex1 Leistung_X1: ([\d.]+)
attr powermonitor readingsRegex2 Strom_X1: ([\d.]+)
attr powermonitor readingsRegex3 Leistung_X2: ([\d.]+)
attr powermonitor readingsRegex4 Strom_X2: ([\d.]+)

attr powermonitor stateFormat {sprintf("%.1f Leistung_X1 Watt, %.1f Strom_X1, %.1f Leistung_X2, %.1f Strom_X2", ReadingsVal($name,"Leistung_X1",0), ReadingsVal($name,"Strom_X1",0), ReadingsVal($name,"Leistung_X2",0), ReadingsVal($name,"Strom_X2",0))}

attr powermonitor timeout 10
attr powermonitor verbose 1

######################################

define Messwerte readingsGroup <Anschluss>,<Wert>,<Einheit>,<Zeitstempel> powermonitor:Leistung_X1: powermonitor:Strom_X1: powermonitor:Leistung_X2: powermonitor:Strom_X2:
attr Messwerte group Leistung
attr Messwerte room Keller
attr Messwerte style style="font-size:16px"

rogseut

Hallo zusammen

hier ein Zwischenstand.
Jedoch hab ich es immer noch nicht geschaft in der Readingsgroup die Einheit mit anzeigen zu lassen.

Jetzt möchte ich eine Pushover Nachricht verschicken wenn die Waschmaschine bzw. Trockner fertig ist.
Hierfür nutze ich das DOIF Modul.
Wie bekomme ich nun die Leistung_X1 in die DOIF Anweisung?


#---------------------------------
#--        Powermonitor         --
#---------------------------------
define powermonitor HTTPMOD http://192.168.0.122/ 10
attr powermonitor userattr readingsName1 readingsName2 readingsName3 readingsName4 readingsRegex1 readingsRegex2 readingsRegex3 readingsRegex4 stateFormat timeout verbose
attr powermonitor readingsName1 Leistung_X1
attr powermonitor readingsName2 Strom_X1
attr powermonitor readingsName3 Leistung_X2
attr powermonitor readingsName4 Strom_X2
attr powermonitor readingsRegex1 Leistung_X1: ([\d.]+)
attr powermonitor readingsRegex2 Strom_X1: ([\d.]+)
attr powermonitor readingsRegex3 Leistung_X2: ([\d.]+)
attr powermonitor readingsRegex4 Strom_X2: ([\d.]+)
attr powermonitor room Keller
attr powermonitor stateFormat {sprintf("%.0f Watt, %.1f Ampere, %.0f  Watt, %.1f Ampere", ReadingsVal($name,"Leistung_X1",0), ReadingsVal($name,"Strom_X1",0), ReadingsVal($name,"Leistung_X2",0), ReadingsVal($name,"Strom_X2",0))}
attr powermonitor timeout 10
attr powermonitor verbose 1


#--Anzeige--
define Messwerte readingsGroup <Anschluss>,<Wert>,<Einheit>,<Zeitstempel> powermonitor:Leistung_X1: powermonitor:Strom_X1: powermonitor:Leistung_X2: powermonitor:Strom_X2:
attr Messwerte group Leistung
attr Messwerte nameStyle style="font-weight:bold"
attr Messwerte room Keller
attr Messwerte style style="font-size:16px"

#--LogFile--
define FileLog_pwrmonitor FileLog ./log/pwrmonitor-%Y-%m.log pwrmonitor
attr FileLog_pwrmonitor logtype text
attr FileLog_pwrmonitor room Keller


#---------------------------------
#-- Waschmaschine Fertigmeldung --
#---------------------------------
#Waschmaschine Fertigmeldung
define waschmaschine_betrieb dummy
attr waschmaschine_betrieb event-on-change-reading state

define waschmaschine_DI DOIF ([waschmaschine_Pwr:power]>100) (set waschmaschine_betrieb on) DOELSEIF ([waschmaschine_Pwr:power]<50) (set waschmaschine_betrieb off)
attr waschmaschine_DI room Keller
attr waschmaschine_DI wait 20:300

define waschmaschine_fertig_pushover notify waschmaschine_betrieb:off set PushoverMR msg 'Waschmaschine' 'Waschmaschine ist jetzt fertig!'


#---------------------------------
#--   Trockner Fertigmeldung    --
#---------------------------------
#Trockner Fertigmeldung
define trockner_betrieb dummy
attr trockner_betrieb event-on-change-reading state

define trockner_DI DOIF ([trockner_Pwr:power]>100) (set trockner_betrieb on) DOELSEIF ([trockner_Pwr:power]<50) (set trockner_betrieb off)
attr trockner_DI room Keller
attr trockner_DI wait 20:300

define trockner_fertig_pushover notify trockner_betrieb:off set PushoverMR msg 'Trockner' 'Trockner ist jetzt fertig!'



Rohan

Zitat von: rogseut am 22 Januar 2015, 19:27:44... Jedoch hab ich es immer noch nicht geschaft in der Readingsgroup die Einheit mit anzeigen zu lassen. ...

Beispiel aus dem Wiki

Anpassen und fertig?

Gruß
Thomas
Fhem auf Mini-ITX mit Celeron 2-Core, HMLAN (> 55 Devices), CUL (FS20 und EM), RFXtrx 433E, Arduino (einige DS18B20), RPi mit 1-Wire (DS2423 für S0-Signale, DS18B20+), RPi/Arduino mit MQ-5 und MQ-9 (CO- und CNG/LPG-Sensor), CO-20 IAQ Sensor

rogseut

#8
Hallo zusammen.

Ich habe fertig und möchte das Ergebnis mit euch teilen.
Vieleicht hilft es dem ein oder anderen.
Vielen dank an alle die mich hier unterstützt haben.

Motivation für das Projekt:
Wir wohnen im 4. Stock einer Mietwohnung und die Waschmaschine und Trockner stehen im Keller.
Es hat meiner Freundin genervt das sie des öfteren in den Keller gegangen ist aber die Maschinen noch nicht fertig waren.
Bei den vielen Treppenstufen verstehe ich das auch. Daher hat dieses Projekt einen spitzen WAF !! ;-)

Lösungsansätze:
Da kein WLAN und kein Funk im Keller zur Verfügung steht kamen die gängigen Funksteckdosen mit Leistungsmessung nicht in Frage,
eine andere Lösung musste her. Ich bemerkte das die Waschmaschine und der Trockner in meiner Wohnung getrennt abgesichert sind,
somit lag eine mögliche Lösung auf der Hand.

1. Messen des Stromverbrauchs der beiden Maschinen innerhalb der Unterverteilung der Wohnung
   http://openenergymonitor.org/emon/node/156
2. Berechnung der Leistung (siehe Arduino Code; Anschluss der beiden Messwandler am AnalogIn A2 und A3)
   http://www.technik-fan.de/index.php/Open_Energy_Monitor
3. Messdaten auf Webinterface darstellen.
4. Daten FHEM vom Arduino Webinterface abholen (siehe FHEM Code)
5. Daten auswerten (siehe FHEM Code)
6. Nachricht aufs Smartphone (siehe FHEM Code)

Benötigte Bauteile:
1x Raspberry PI mit FHEM Installation                                      Starterkit: 50€
1x Arduino UNO                                                                                         10€
1x Ethernet Shield                                                                                     10€
1x Lochrasterplatine               
4x 100kOhm Widerstand
2x 100nF Elko
ein paar Stiftleisten und Buchsen, ein bischen Draht 0,25mm²
2x Stromwandler (SCT-013-030)                                                               20€                                               
2x 3,5mm Klinkenbuchse                                                                             2€                                                                                               
1x T-Link Mini Router (TL-WR702N) für die WLAN Anbindungdes Arduino 20€

Gesamtkosten:                                                                             ca.110-120€

FHEM CODE

#---------------------------------
#--        Powermonitor         --
#---------------------------------
define powermonitor HTTPMOD http://192.168.0.122/ 10
attr powermonitor userattr readingsName1 readingsName2 readingsName3 readingsName4 readingsRegex1 readingsRegex2 readingsRegex3 readingsRegex4 stateFormat timeout verbose
attr powermonitor readingsName1 Leistung_X1
attr powermonitor readingsName2 Strom_X1
attr powermonitor readingsName3 Leistung_X2
attr powermonitor readingsName4 Strom_X2
attr powermonitor readingsRegex1 Leistung_X1: ([\d.]+)
attr powermonitor readingsRegex2 Strom_X1: ([\d.]+)
attr powermonitor readingsRegex3 Leistung_X2: ([\d.]+)
attr powermonitor readingsRegex4 Strom_X2: ([\d.]+)
attr powermonitor stateFormat {sprintf("%.0f Watt, %.2f Ampere, %.0f  Watt, %.2f Ampere", ReadingsVal($name,"Leistung_X1",0), ReadingsVal($name,"Strom_X1",0), ReadingsVal($name,"Leistung_X2",0), ReadingsVal($name,"Strom_X2",0))}
attr powermonitor timeout 10
attr powermonitor verbose 1


#--Anzeige--
define Messwerte readingsGroup powermonitor:Leistung_X1: powermonitor:Strom_X1: powermonitor:Leistung_X2: powermonitor:Strom_X2:
attr Messwerte room Keller
attr Messwerte group Powermonitor
attr Messwerte mapping {'Leistung_X1' => 'Waschmaschine_X1', 'Strom_X1' => 'Waschmaschine_X1', 'Leistung_X2' => 'Trockner_X2', 'Strom_X2' => 'Trockner_X2'}
attr Messwerte valueFormat {'Leistung_X1' => "%.0f Watt", 'Strom_X1' => "%.2f Ampere", 'Leistung_X2' =>"%.0f Watt", 'Strom_X2' =>"%.2f Ampere" }
attr Messwerte style style="font-size:16px"
attr Messwerte nameStyle style="font-weight:bold"


#--LogFile--
define FileLog_pwrmonitor FileLog ./log/pwrmonitor-%Y-%m.log pwrmonitor
attr FileLog_pwrmonitor logtype text


#---------------------------------
#-- Waschmaschine Fertigmeldung --
#---------------------------------
#Waschmaschine Fertigmeldung
define waschmaschine_betrieb dummy
attr waschmaschine_betrieb event-on-change-reading state

define waschmaschine_DI DOIF ([powermonitor:Leistung_X1]>100) (set waschmaschine_betrieb on) DOELSEIF ([powermonitor:Leistung_X1]<50) (set waschmaschine_betrieb off)
attr waschmaschine_DI wait 20:60

define waschmaschine_fertig_pushover notify waschmaschine_betrieb:off set PushoverMR msg 'Waschmaschine' 'Die Waschmaschine ist jetzt fertig!'


#---------------------------------
#--   Trockner Fertigmeldung    --
#---------------------------------
#Trockner Fertigmeldung
define trockner_betrieb dummy
attr trockner_betrieb event-on-change-reading state

define trockner_DI DOIF ([powermonitor:Leistung_X2]>100) (set trockner_betrieb on) DOELSEIF ([powermonitor:Leistung_X2]<50) (set trockner_betrieb off)
attr trockner_DI wait 20:60

define trockner_fertig_pushover notify trockner_betrieb:off set PushoverMR msg 'Trockner' 'Der Trockner ist jetzt fertig!'


   
#########################################################################
## Pushover Service
#########################################################################
#########################################################################
## Pushnachrichten versenden
#########################################################################
define PushoverMR Pushover [i]hier kommen eure keys hin[/i]
attr PushoverMR ssl 1


libraries für den Arduino
https://github.com/openenergymonitor/EmonLib

Arduino Uno Code

// EmonLibrary examples openenergymonitor.org, Licence GNU GPL V3
#include "SPI.h"                                       // Include SPI Library
#include "Ethernet.h"                                  // Include Ethernet Library
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };   // MAC Adresse
byte ip[] = { 192, 168, 0, 122 };                      // IP Adresse; Arduino
byte gateway[] = { 192, 168, 0, 1 };                   // IP Adresse; Gateway
byte subnet[] = { 255, 255, 255, 0 };                  // Subnet Maske
EthernetServer server(80);                             // Server auf Port 80

#include "EmonLib.h"                                   // Include Emon Library
EnergyMonitor emon1;                                   // 1. Instance des Bausteins X1
EnergyMonitor emon2;                                   // 2. Instance des Bausteins X2
float u1 = 230.0;                                      // Spannung in Volt für Leistungsberechnung X1
float u2 = 230.0;                                      // Spannung in Volt für Leistungsberechnung X2

void setup()

  Serial.begin(9600);                                  // Serial Monitor Starten
 
 
  Ethernet.begin(mac, ip, gateway, subnet);            // Starten der Ethernet Verbindung
  server.begin();                                      // Starten des Servers
  Serial.print("Server Adresse: ");                    // Ausgabe von Text
  Serial.println(Ethernet.localIP());                  // Ausgabe der Server IP
 
  emon1.current(2, 30.0);                              // Current: analoginput pin, calibration. X1
  emon2.current(3, 30.0);                              // Current: analoginput pin, calibration. X2
}

void loop()
{
  double Irms1 = emon1.calcIrms(1480);  // Berechnen des Irms (Abtastrate) X1
  double Irms2 = emon2.calcIrms(1480);  // Berechnen des Irms (Abtastrate) X2
 
  Serial.print("Leistung_X1: ");        // Ausgabe von Text
  Serial.print(Irms1*u1);               // Ausgabe der Leistung an X1 (P=U*I)
  Serial.print(" ");                    // Ausgabe von Text
  Serial.print("Strom_X1: ");           // Ausgabe von Text
  Serial.print(Irms1);                  // Ausgabe des Stroms an X1
  Serial.print(" ");                    // Ausgabe von Text
  Serial.print("Leistung_X2: ");        // Ausgabe von Text
  Serial.print(Irms2*u2);               // Ausgabe der Leistung an X1 (P=U*I)
  Serial.print(" ");                    // Ausgabe von Text
  Serial.print("Strom_X2: ");           // Ausgabe von Text
  Serial.print(Irms2);                  // Ausgabe des Stroms an X1
 
  EthernetClient client = server.available(); // warte auf Anfragen VOM Client
  if (client)
  {
    {
    client.println("HTTP/1.1 200 OK");
    client.println("Content-Type: text/html");
    client.println("Connection: close");
    client.println();
    //client.println("<!DOCTYPE HTML>");
    client.println("<html>");
    //client.println("<meta http-equiv=\"refresh\" content=\"5\">");
   
    client.print("Leistung_X1: ");
    client.print(Irms1*u1);
    client.println("<br />");
    client.print("Strom_X1: ");
    client.print(Irms1);
    client.println("<br />");
    client.print("Leistung_X2: ");
    client.print(Irms2*u2);
    client.println("<br />");
    client.print("Strom_X2: ");
    client.print(Irms2);
    client.println("<br />");
    }
  client.println("</html>"); 
  }
  delay(10);      // geben Browser Zeit, um Daten zu empfangen
  client .stop(); // trenne Verbindung
}

Verbesserungspotential:
mögliche Verbesserung der WLAN Performance; im Moment werden zyklisch alle 10s die Werte vom Powermonitor abgefragt, dies erzeugt permanent traffic.

Mögliche Abhilfe:
1. ON/OFF Funktion für die Überwachung der Maschinen
2. Abfrage des Powermonitor mit zwei verschiedenen Abtastraten. im Standby Betrieb alle 10min. bei Erkennung das eine Maschine läuft wieder alle 10sec.