HTTPMOD Abfrage von Arduino Server

Begonnen von daruel, 01 Januar 2018, 12:13:27

Vorheriges Thema - Nächstes Thema

daruel

Hallo und ein Frohes neues Jahr!

habe einen Tempserver aus einem Arduino mit 2 DHT22 gebastelt, der arbeitet auch wie er soll und gibt folgendes im Browser (Quelltext) wieder

<!DOCTYPE HTML>
<html>
Humidity inside: 39.20 % <p />
Temperature inside: 20.60 *C
<p />
Humidity outside: 42.10 % <p />
Temperature outside: 20.50 *C</html>



Habe das mit HTTPMOD hauptsächlich per copy&paste versucht, da ich eher der Typ für die Hardware bin als mich in Codes einzulesen.

Leider bekomme ich es überhaupt nicht hin, dass HTTPMOD auch nur irgendeinen Wert zurück gibt, habe das bei meinem Sprit- und Ölpreismonitor jedoch geschafft.

Hier die List

Internals:
   BUSY       0
   CFGFN     
   CHANGED   
   DEF        http://192.168.178.120 10
   Interval   10
   LASTSEND   1514805159.07131
   MainURL    http://192.168.178.120
   ModuleVersion 3.4.0 - 9.9.2017
   NAME       Arduino
   NR         3376
   STATE      stateFormat Ti: Temperature inside Hi: Humidity inside To: Temperature outside Ho: Humidity outside
   TRIGGERTIME 1514805169.06942
   TRIGGERTIME_FMT 2018-01-01 12:12:49
   TYPE       HTTPMOD
   addr       http://192.168.178.120:80
   auth       0
   data       
   displayurl http://192.168.178.120
   header     
   host       192.168.178.120
   httpversion 1.0
   hu_blocking 0
   ignoreredirects 0
   loglevel   4
   path       /
   protocol   http
   redirects  0
   timeout    2
   url        http://192.168.178.120
   value      0
   QUEUE:
   READINGS:
   REQUEST:
     data       
     header     
     ignoreredirects 0
     retryCount 0
     type       update
     url        http://192.168.178.120
     value      0
   sslargs:
Attributes:
   get1CheckAllReadings 1
   reading01Name Temperature inside
   reading01Regex Temperature inside:.([\d\.]+)
   reading02Name Humidity inside
   reading02Regex Humidity inside:.([\d\.]+)
   reading03Name Temperature outside
   reading03Regex Temperature outside:.([\d\.]+)
   reading04Name Humidity outside
   reading04Regex Humidity outside:.([\d\.]+)
   room       Keller
   stateFormat stateFormat Ti: Temperature inside Hi: Humidity inside To: Temperature outside Ho: Humidity outside
   userattr   get1CheckAllReadings:0,1 reading01Name reading01Regex reading02Name reading02Regex reading03Name reading03Regex reading04Name reading04Regex


die Felder "httpheader" oder "buf" erscheinen erst garnicht.


Was muss ich also tun, um diese 4 Readings zu erhalten?

Vielen Dank im Voraus

frank

ich würde mal verbose 5 setzen und in fhem.log schauen.
ausserdem das attr get1CheckAllReadings löschen.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

daruel

Habe die Änderungen gemacht, ändert nichts.

Log gibt das hier raus

2018.01.01 16:07:30 4: Arduino: GetUpdate called (update)
2018.01.01 16:07:30 4: Arduino: update timer modified: will call GetUpdate in 10.0 seconds at 2018-01-01 16:07:40
2018.01.01 16:07:30 4: Arduino: AddToQueue adds update, initial queue len: 0
2018.01.01 16:07:30 5: Arduino: AddToQueue adds type update to URL http://192.168.178.120, no data, no headers, retry 0
2018.01.01 16:07:30 5: Arduino: HandleSendQueue called, qlen = 1
2018.01.01 16:07:30 4: Arduino: HandleSendQueue sends request type update to URL http://192.168.178.120, No Data, No Header,
timeout 2
2018.01.01 16:07:30 5: HttpUtils url=http://192.168.178.120
2018.01.01 16:07:30 3: Arduino: Read callback: Error: http://192.168.178.120: malformed or unsupported URL
2018.01.01 16:07:30 4: Arduino: Read callback: request type was update retry 0, no headers, body empty
2018.01.01 16:07:30 5: Arduino: ExtractSid called, context reading, num
2018.01.01 16:07:30 4: Arduino: CheckAuth decided no authentication required


Wie kommt die Meldung "Error: http://192.168.178.120: malformed or unsupported URL" zustande? Im Browser eingefügt funktioniert sie.

frank

ich habe bei mir in der definition am ende der ip noch einen slash.
kannst du denn vom fhem server die ip pingen?
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

daruel

Das mit dem Slash hatte ich auch schon, bringt keine Veränderung.

Bei deinem Hinweis mit dem Ping habe ich aber ein merkwürdiges Problem entdeckt.

Ich kann auf den Arduino Server nur von meinem "Haupt - PC" aus zugreifen. Auf allen anderen Geräten, egal ob Laptop oder Smartphone, kann ich nicht auf die Seite zugreifen. Das Netzwerk funktioniert sonst Tadellos und der Arduino hängt am selben Switch wie der Rest inkl. WLAN Access Point.

D.h. es wird wohl kein FHEM Problem sein, aber ich weiß jetzt noch weniger wo der Fehler liegt.

viegener

Die IP-Adresse (192.168.178.120) sieht so aus, wie eine lokale Zufallsadresse, wenn kein DHCP aktiv ist.

Hast Du DHCP im lokalen Netzwerk aktiv?
Wenn ja - ist 192.168... wirklich der Bereich der IP-Adressen?

Wenn nein - ist DHCP beim Arduino aktiv?

Wenn nein wirst Du vermutlich das aktivieren müssen oder routing-Tabellen anpassen (würde ich aber von abraten)
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

daruel

Die IP habe ich in dem Code vom Arduino vorgegeben, DHCP ist auf dem Router aktiv.
Habe das bei meinem Arduino mit der FIRMATA auch so gemacht, der läuft perfekt.

Was wäre an dem Bereich der IP Adressen falsch? Bis jetzt habe ich hier alles damit Gruppiert, damit man ungefähr weiß um welche Geräte es sich handelt, wenn man nur die IP liest.

Habe jetzt auch die IP im Arduino Code auf eine Stelle neben der Firmata geändert - bringt nichts.

viegener

Deshalb die Fragen nach den IP-Bereichen. Also ich verstehe das so, dass Du diesen IP-Bereich benutzt. Bleibt immer noch die Frage, ob die anderen Rechner den Arduino-Server wirklich übers Netz erreichen können. Für den Moment nehme ich einfach mal an, ja

Dann ist ohne die Firmware des Arduino zu kennen schwer zu sagen was schief läuft.
Mögliche Ansätze:
- Ist im Arduino eine Begrenzung auf bestimmte Adressen aktiv?
- Gibt es eine Beschränkung der gleichzeitigen Zugriffe und vielleicht ist schon einer aktiv?

Im Grund genommen vermute ich aber immer noch, dass es ein Routing-Problem ist, denn vielleicht können alle Rechner den Arduino erreichen, dieser aber nicht antworten (z.B. da er nur 255.255.255.0 als Netmask hat?).

Gib doch mal ein paar Infos zu den Netzwerkadressen heraus, so ist das irgendwie stochern im Dunkeln
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

daruel

Vorab schonmal vielen Dank für die Bemühungen mir hier zu helfen.

Hier mal der Arduino Code, eventuell findet ja jemand sofort den Fehler.

#include <DHT.h>

#define DHTPIN_inside 6     
#define DHTPIN_outside 7

// Uncomment whatever type you're using!
//#define DHTTYPE DHT11   // DHT 11
#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

DHT dht_in (DHTPIN_inside, DHTTYPE);
DHT dht_out (DHTPIN_outside, DHTTYPE);



// Ethernet

#include <SPI.h>
#include <Ethernet.h>


//MAC and IP address and Server Port:

   byte mac[] = {0xAD, 0xEE, 0xBB, 0xFF, 0xFA, 0xAD};
   IPAddress ip(192,168,178,35);
   
   EthernetServer server(80);

void setup() {
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  dht_in.begin();
  dht_out.begin();

 

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {

  delay (1000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float hi = dht_in.readHumidity();
  float ti = dht_in.readTemperature();
  float ho = dht_out.readHumidity();
  float to = dht_out.readTemperature();


// Ausgabe am Seriellen Monitor
  // check if returns are valid, if they are NaN (not a number) then something went wrong!
  if (isnan(to) || isnan(ti) || isnan(ho) || isnan(hi)) {
    Serial.println("Failed to read from DHT");
  } else {
    Serial.print("Humidity inside: ");
    Serial.print(hi);
    Serial.print(" %\t");
    Serial.print("Temperature inside: ");
    Serial.print(ti);
    Serial.println(" *C");
    Serial.print("Humidity outside: ");
    Serial.print(ho);
    Serial.print(" %\t");
    Serial.print("Temperature outside: ");
    Serial.print(to);
    Serial.println(" *C");
    delay (2000);
  }

  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
       
         
// Ausgabe am Webserver
       
          client.print("Humidity inside: ");
          client.print(hi);
          client.print(" %\t");
          client.println("<p />");
          client.print("Temperature inside: "); 
          client.print(ti);
          client.println(" *C");
          client.println("<p />");
          client.print("Humidity outside: ");
          client.print(ho);
          client.print(" %\t");
          client.println("<p />");
          client.print("Temperature outside: "); 
          client.print(to);
          client.print(" *C");
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}



Ich weiß nicht genau, was ich zu den Netzwerkadressen sagen soll.  An 192.168.178.1 hängt eine Fritz.box als router mit DHCP, dann kommen 2 Router als WLAN AccessP. aber ohne DHCP, alles auf dem selben 24 Port Switch durchs haus Verteilt.




viegener

Zitat von: daruel am 02 Januar 2018, 21:08:15

Ich weiß nicht genau, was ich zu den Netzwerkadressen sagen soll.  An 192.168.178.1 hängt eine Fritz.box als router mit DHCP, dann kommen 2 Router als WLAN AccessP. aber ohne DHCP, alles auf dem selben 24 Port Switch durchs haus Verteilt.


Naja der Router interessiert jetzt eher wenig:

Es gibt ja einen Rechner, der den Arduino erreicht und andere die Ihn nicht erreichen...
- Was sind deren IP-Adressen?
- Welche DHCP-Adressen werden vergeben
- Wenn Du feste IP-Adressen vergibts sind diese mit demselben Präfix 192.168.178 ?

Ich versuche ja rauszufinden, ob die netmask das Problem sein könnte, aber auch nach mehreren Beiträgen ist das immer noch unklar
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

andies

 Bei httpmod muss definitiv ein slash ans Ende, wenn nur die IP angegeben wird.

Weist denn dein DHCP dem arduino keine IP zu? Das machst Du ja im Code selber, ist das im Netzwerk so eingestellt, dass es keine Probleme gibt? IP nicht doppelt vergeben? Poste doch auch mal den serial Output.



Gesendet vom iPhone mit Tapatalk Pro
FHEM 6.3 auf RaspPi4 (Raspbian:  6.6.28+; Perl: v5.36.0)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

daruel

Also:

der DHCP vergibt 192.168.178. 20-200

Der iMac ( von dem ich es erreiche) hat die .25 , vom iPhone .52  gehts nicht, von einem Win 10 Laptop .62 auch nicht. Alle bekommen die ip per DHCP.

Lediglich der Raspberry von FHEM , ein Arduino mit Firmata, ein Nas und die beiden Wlan AP haben eine feste IP, also Geräte die möglichst auch immer unter dieser zu finden sein sollen. Diese befinden sich alle im Bereich zwischen .1 und .20 und haben natürlich alle die. 192.168.178 vorstehen.

Dem nicht zu erreichenden Arduino habe ich schon 4-5 verschieden verpasst, .12 .35. .120, und immer das gleiche Spiel. Der iMac erkennt ihn, der Rest nicht.
Auch wenn der iMac aus ist und somit nicht zugreifen kann, erreiche ich das Teil nicht.


Wenn noch Fragen offen sein sollten, dann verstehe ich sie nicht ;-)

hier noch die serielle Ausgabe vom Arduino

server is at 192.168.178.12
Humidity inside: 38.50 % Temperature inside: 20.10 *C
Humidity outside: 40.70 % Temperature outside: 20.30 *C
new client
GET / HTTP/1.1
Host: 192.168.178.12
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7
Referer: http://192.168.178.12/
Cache-Control: max-age=0
Accept-Language: de-de

client disonnected
Humidity inside: 38.40 % Temperature inside: 20.10 *C
Humidity outside: 40.70 % Temperature outside: 20.30 *C
Humidity inside: 38.40 % Temperature inside: 20.10 *C
Humidity outside: 40.60 % Temperature outside: 20.30 *C
new client
GET / HTTP/1.1
Host: 192.168.178.12
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7
Referer: http://192.168.178.12/
Cache-Control: max-age=0
Accept-Language: de-de

client disonnected
Humidity inside: 38.50 % Temperature inside: 20.10 *C
Humidity outside: 40.60 % Temperature outside: 20.30 *C
Humidity inside: 38.50 % Temperature inside: 20.10 *C
Humidity outside: 40.70 % Temperature outside: 20.30 *C


usw.









viegener

OK, damit würde ich annehmen, dass es nicht um IP-Erreichbarkeit in Deinem Netz geht, da alle im selben Subnetz sind.

Damit bleibt für mich nur die Vermutungen

- Dass der Arduino mit den Anfragen der anderen nicht umgehen kann --> das müsste sich aber normalerweise im log finden
- dass der Arduino die Anfragen der anderen nicht bearbeiten kann, weil beschäftigt

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

daruel

Ich habe es auch mit einem vom System her identischen MacBook ohne erfolg versucht und alles andere war dabei aus. Warum erreiche ich ihn dann vom iMac?
Auch direkt am Switch oder anderen RJ45 dosen tut sich nichts.

Habe gerade nochmal im die IP geändert, auf dem iMac bekomm ich übers Terminal sofort einen Ping, gehe ich über das Terminal zum Raspberry läuft er ins leere....

Hat jemand eine Idee was man im Arduino Code ändern könnte oder ein anderes Beispiel ?


viegener

Na ja - das mit dem ping kann bei recht ähnlichen Rechnern trotzdem durch die lokale Firewall im Rechner verhindert werden.

Hast Du auf dem Macbook auch versucht die webseite zu erreichen?
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können