#include #include #include #include "config.h" #include "relays.h" #include "sensors.h" WebServer server(80); float batterySOC = 82.0; float batteryVoltage = 13.2; float batteryCurrent = -6.4; float batteryRemainingAh = 82.0; float batteryRuntimeHours = 12.0; float batteryTemp = 76.0; void handleStatus() { DynamicJsonDocument doc(2048); doc["timestamp"] = millis(); JsonObject battery = doc.createNestedObject("battery"); battery["soc"] = batterySOC; battery["voltage"] = batteryVoltage; battery["current"] = batteryCurrent; battery["remaining_ah"] = batteryRemainingAh; battery["runtime_hours"] = batteryRuntimeHours; battery["temperature_f"] = batteryTemp; JsonObject temps = doc.createNestedObject("temps"); temps["fridge_zone_1"] = sensors.fridgeZone1Online ? sensors.fridgeZone1 : nullptr; temps["fridge_zone_2"] = sensors.fridgeZone2Online ? sensors.fridgeZone2 : nullptr; temps["rear_seat"] = sensors.rearSeatOnline ? sensors.rearSeat : nullptr; temps["outside"] = sensors.outsideAirOnline ? sensors.outsideAir : nullptr; JsonObject sensorHealth = doc.createNestedObject("sensor_health"); sensorHealth["fridge_zone_1"] = sensors.fridgeZone1Online; sensorHealth["fridge_zone_2"] = sensors.fridgeZone2Online; sensorHealth["rear_seat"] = sensors.rearSeatOnline; sensorHealth["outside"] = sensors.outsideAirOnline; JsonObject relayObj = doc.createNestedObject("relays"); relayObj["starlink"] = relays.starlink; relayObj["fridge"] = relays.fridge; JsonObject vehicle = doc.createNestedObject("vehicle"); vehicle["ignition_on"] = digitalRead(IGNITION_PIN); JsonObject network = doc.createNestedObject("network"); network["wifi_enabled"] = true; network["rs485_connected"] = true; String output; serializeJsonPretty(doc, output); server.send(200, "application/json", output); } void handleStarlinkOn() { relays.starlink = true; updateRelayOutputs(); server.send(200, "text/plain", "OK"); } void handleStarlinkOff() { relays.starlink = false; updateRelayOutputs(); server.send(200, "text/plain", "OK"); } void handleFridgeOn() { relays.fridge = true; updateRelayOutputs(); server.send(200, "text/plain", "OK"); } void handleFridgeOff() { relays.fridge = false; updateRelayOutputs(); server.send(200, "text/plain", "OK"); } void setup() { Serial.begin(115200); Serial.println(); Serial.println("=================================="); Serial.println("Xterra Controller Booting"); Serial.println("=================================="); pinMode(IGNITION_PIN, INPUT); initRelays(); initSensors(); WiFi.mode(WIFI_AP); bool apResult = WiFi.softAP("XterraController"); if (apResult) { Serial.println("AP Started"); Serial.print("IP: "); Serial.println(WiFi.softAPIP()); } server.on("/status", handleStatus); server.on("/relay/starlink/on", handleStarlinkOn); server.on("/relay/starlink/off", handleStarlinkOff); server.on("/relay/fridge/on", handleFridgeOn); server.on("/relay/fridge/off", handleFridgeOff); server.begin(); Serial.println("Web Server Started"); } void loop() { server.handleClient(); static unsigned long lastSensorUpdate = 0; if (millis() - lastSensorUpdate > 5000) { updateSensors(); lastSensorUpdate = millis(); Serial.println("Sensor Update"); } }